RecyclerView的linearLayoutManager.findViewByPosition()问题

发布于 2022-09-04 03:59:38 字数 3803 浏览 11 评论 0

看到一个博文Android轻松实现RecyclerView悬浮条

@Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {//滚动时回调(过程) dx: 水平滚动距离 dy:垂直滚动距离
                super.onScrolled(recyclerView, dx, dy);
                //dy > 0 时为手指向上滚动,列表滚动显示下面的内容
                //dy < 0 时为手指向下滚动,列表滚动显示上面的内容
                Log.e(TAG, "onScrolled: " + dx + "\\" + dy );

                View view = linearLayoutManager.findViewByPosition(mCurrentPosition + 1);
                //View.getY()获取到的值为 相对于父视图而言的上边缘的距离  ==》getTop + getTranslationY

                //view.getX 相当于 view距离父容器左边缘的距离 ==》 getleft+getTranslationX(view的偏移量)
                if (view != null) {
                    if (view.getTop() <= mSuspensionHeight) { //view得到的高 小于等于 获取 155
                        mSuspensionBar.setY(-(mSuspensionHeight - view.getTop())); //    给Bar设置高度 ( - 155-(很大的正数) )  取相反数 是因为 y轴正方向向下
                    } else {
                        mSuspensionBar.setY(0);//setY ==> setTranslation(y-getTop)  setTranslationY 在竖直方向上将该控件从它本来的位置偏移i个像素
                    }
                }
                //悬浮条显示的信息是来自第一个可见View的,而其下方的View正是第二个列表项,我们可以获取到它的top值。
                //mCurrentPosition为悬浮条信息来自的那个列表项在RecyclerView的位置
                if (mCurrentPosition != linearLayoutManager.findFirstVisibleItemPosition()) {//返回第一个可见视图的适配器位置
                    //linearLayoutManager.findFirstCompletelyVisibleItemPosition()//返回第一个完全可见视图的适配器位置
                    mCurrentPosition = linearLayoutManager.findFirstVisibleItemPosition();
                    mSuspensionBar.setY(0);

                    updateSuspensionBar();
                }
            }
        });
       // updateSuspensionBar();
 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/feed_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:scrollbars="vertical" />

        <RelativeLayout
            android:id="@+id/suspension_bar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white">

            <com.xiaopo.flying.suspensionbar.CircleImageView
                android:id="@+id/iv_avatar"
                android:layout_width="44dp"
                android:layout_height="44dp"
                android:padding="8dp"
                android:src="@drawable/avatar1" />

            <TextView
                android:id="@+id/tv_nickname"
                android:layout_width="wrap_content"
                android:layout_height="44dp"
                android:layout_marginLeft="8dp"
                android:layout_toRightOf="@id/iv_avatar"
                android:gravity="center_vertical"
                android:text="@string/snowbean"
                android:textSize="12sp" />

            <View
                android:id="@+id/top_divider"
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:layout_below="@id/tv_nickname"
                android:background="#33000000" />
        </RelativeLayout>

    </FrameLayout>

以上为局部代码
问题1:linearLayoutManager.findViewByPosition(mCurrentPosition + 1) 得到的View 是 recyclerview中的重复很多遍的那个item吗
问题2: 为什么向上滑动时 dy的值是一位数(这一位数 是什么鬼啊)
问题3:向上滑动时 getTop 和getX 值是相同的 但是 getX= getTranslationX+getTop啊 为什么getTranslationX一直是0呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

本宫微胖 2022-09-11 03:59:38
  • 问题一. 得到是数据源 dataList.get(position) 的那个 Item.
  • 问题二. dy 是每次滑动的偏移量,不一定是一位数,如果滑动快 |dy| 会比较大,反之会比较小。
  • 问题三. 这里的 RecyclerView 是上下滑动的, getX() 和 getTranslationX() 都是个常量 0 不会变的,因为 Item 在水平方向都没有动过。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文