当前位置: 首页 > 知识库问答 >
问题:

如何确定最可见的视图位置后,再循环视图适配器数据更改?

秦信瑞
2023-03-14

我想确定回收站视图中最明显的项目,因此我使用以下方法:

public int getMostVisibleIndex() {
        // try to figure which child is the most visible on screen

        LinearLayoutManager layoutManager = ((LinearLayoutManager) getLayoutManager());

        mFirstVisibleIndex = layoutManager.findFirstVisibleItemPosition();
        mLastVisibleIndex = layoutManager.findLastVisibleItemPosition();

        // How do I use convertPreLayoutPositionToPostLayout() ?

        VisibleIndex mostVisible = null;
        if (mFirstVisibleIndex != -1|| mLastVisibleIndex != -1) {


            // if it's not the same
            if (mFirstVisibleIndex != mLastVisibleIndex) {
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) this.getLayoutManager();

                // get the visible rect of the first item
                Rect firstPercentageRect = new Rect();
                linearLayoutManager.findViewByPosition(mFirstVisibleIndex).getGlobalVisibleRect(firstPercentageRect);

                // get the visible rect of the last item
                Rect lastPercentageRect = new Rect();
                linearLayoutManager.findViewByPosition(mLastVisibleIndex).getGlobalVisibleRect(lastPercentageRect);

                // since we're on a horizontal list
                if (firstPercentageRect.width() > lastPercentageRect.width()) {
                    return mFirstVisibleIndex;
                } else {
                    return mLastVisibleIndex;
                }

            } else {
                return mFirstVisibleIndex;
            }
        }
        return -1;
    }

它工作得很好,但是在我更改数据集,并在我的适配器中调用任何通知*Changed方法后,如果我尝试使用上述函数,则findFirstVisibleItemPotionfindLastVisibleItemPotion返回的项目位置是错误的。

我注意到他们都在幕后使用getlayoutposition,我还注意到在文档上写着:

听起来好像转换器PreLayoutPositionToPostLayout正是我正在寻找的,但我不知道如何从RecyclView中访问它。

有什么想法吗?

谢谢你。

共有1个答案

颛孙庆
2023-03-14

在我的例子中,我一次只能在回收器视图中最多有2个可见视图,我在onScrolled中使用这种方法,以便在用户滚动时始终具有mostVisibleItemPotion用于播放视频内容。

因此,getTop()返回此视图相对于其父视图的顶部位置,当用户开始滚动时,第一视图“将从屏幕上消失,“第一视图”。getTop()将返回一个负值,而是第二个视图。getTop()为正值,当<code>第二视图</code>top接近屏幕中心时,获得<code>第一视图的绝对值。getTop()我们将确定从父视图顶部到第二视图顶部<code>firstView<code>top的像素数。getTop()我们将确定<code>第二视图将更改的位置。

  private void detectMostVisibleItem() {
        int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
        int secondItemPosition = layoutManager.findLastVisibleItemPosition();
        if (firstItemPosition == secondItemPosition) {
            mostVisibleItemPosition = firstItemPosition;
        } else {
            View firstView = layoutManager.findViewByPosition(firstItemPosition);
            View secondView = layoutManager.findViewByPosition(secondItemPosition);
            if (Math.abs(firstView.getTop()) <= Math.abs(secondView.getTop())) {
                if (mostVisibleItemPosition != firstItemPosition) {
                    mostVisibleItemPosition = firstItemPosition;
                 ...
                }
            } else {
                if (mostVisibleItemPosition != secondItemPosition) {
                    mostVisibleItemPosition = secondItemPosition;
                 ...
                }
            }
        }
    }
 类似资料:
  • 我的循环视图滚动太慢了。当我通过触摸Recyclerview开始滚动时,它会滞后,但当从上方的视图开始滚动时不会滞后。我还禁用了recyclerview上的嵌套滚动。 这是我的布局: 这是一个滞后的视频。就像滚动跳过了一些布局。

  • 我想在点击recyclerview项目时更新Imageview的图像。下面我发布了我的布局截图: 小图像在recycler视图中,大绿色图像在recycler视图之外。 }//这是活动类 } 我想,当用户点击任何回收器视图时,图像意味着小图像,它将显示在回收器视图之外的大图像视图中。

  • 问题内容: 我有一个扩展ExpandableListActivity的活动。我使用SimpleCursorTreeAdapter填充ExpandableListView。我的布局包含列表视图和空视图。在应用启动时,ExpandableListActivity自动选择要显示的右视图。 我的步骤: 应用启动,没有数据。(屏幕上的空白视图) 将一些数据插入db。 调用adapter.notifyData

  • 我尝试使用Reform2执行recyclerView,但我在代码中执行了:recyclerView适配器构造函数,并且我在此行的MainActivity部分中得到了一个错误-“(flowersList,this)”:我得到了错误:列出匿名Reform2。回调函数 我的代码我的主要活动是: RecycleServiceWFlowerAdapter中的代码是: } 我在RecycleServiceWh

  • 尝试使用自定义变量设置的可见性,但发生错误:。是否可以使用数据绑定设置视图可见性?多谢了。

  • 我试图使用数据绑定实现一个简单的视图隐藏/显示。我有一个api调用,我必须在api调用进行时显示一个progressbar。一旦我得到响应,就必须放弃这个进度并显示数据。我尝试使用数据绑定动态地更改progressbar的可见性。但什么也没发生。只是第一次根据绑定变量设置progresbar可见性。它不是在更新绑定变量时动态更新的。 这里少了什么?为什么不管用?提前感谢…