【问题标题】:findFirstVisibleItemPosition() returns 0 inside nestedScrollViewfindFirstVisibleItemPosition() 在 nestedScrollView 内返回 0
【发布时间】:2020-05-01 16:13:55
【问题描述】:

我在nestedScrollView 中有一个recyclerView。我知道这是一种不好的做法,但在某些情况下,我只能以这种方式处理。

<androidx.core.widget.NestedScrollView
    android:id="@+id/nestedScroll"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            tools:itemCount="1"
            tools:listitem="@layout/item_favorite_tournament"
            tools:visibility="visible" />

</androidx.core.widget.NestedScrollView>

这是我的代码。我将向您展示滚动部分,我需要在其中获取firstVisibleItemPosition。但它返回 0。

private void initList(RecyclerView recycler, View labelNoResults) {
    recycler.setAdapter(mAdapter);
    recycler.setHasFixedSize(true);
    mListLayoutManager = Objects.requireNonNull((LinearLayoutManager) recycler.getLayoutManager());


    recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            final int p = mListLayoutManager.findFirstVisibleItemPosition();
            Log.d("Tag_1", "Position: " + p);
        }
    });
}

我认为问题出在nestedScrollView。那么我怎样才能得到 visibleItemPosition 表单recyclerView 呢?谢谢。

【问题讨论】:

  • 它返回0,因为第一项实际上是“第一个可见项”。在这种情况下,“第一个可见项”只是第一个绑定视图持有者的位置。当您将 RecyclerView 放入 NestedScrollView 时,不会发生回收,所有项目始终绑定,因此第一个绑定的视图持有者始终是第一个。这是因为 RecyclerView 具有未绑定的高度,因此它会占用所有空间。
  • 谢谢。有没有办法解决这个问题?
  • 我认为可以制作自定义布局管理器,但这似乎很复杂,我不知道该怎么做。为什么你需要一个 NestedScrollView 开始?我猜您在 RecyclerView 上方或下方显示了其他视图?在这种情况下,您需要放弃 NestedScrollView 并使用多种视图类型显示这些视图。
  • 是的。我也有一个 recyclerView 在这下面。这将是很长的解释,那么为什么我使用它而不是多个视图类型呢?我有 2 个 recyclerviews,我从不同的来源为他们获取数据。第二个recyclerview也有分页,但第一个没有,我只需要一次更新第二个recyclerview。
  • 不过还是谢谢你,我会尽力用多种视图类型来实现它

标签: java android android-recyclerview android-nestedscrollview


【解决方案1】:

解决此问题的最简单方法是将NestedScrollView 替换为ScrollView。这当然会改变布局的行为,但它会显示正确的位置。

NestedScrollView 的情况下,findFirstVisibleItemPosition() 总是 returns 0findLastVisibleItemPosition() 总是返回 RecyclerView 中的最后一项,无论它们是否对用户可见。发生这种情况是因为 RecyclerView 放在 NestedScrollView 中的行为就像 ListView 一样,没有进行任何回收。这意味着所有项目都同时可见,因为它们都是同时绑定的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多