findFirstVisibleItemPosition() 在nestedScrollView 中返回 0

Hay*_*yan 3 java android android-recyclerview android-nestedscrollview

我有一个recyclerView内幕nestedScrollView。我知道这是一个不好的做法,但有些情况我只能用这种方式处理。

<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>
Run Code Online (Sandbox Code Playgroud)

这是我的代码。我将向您展示滚动部分,我需要在其中获取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);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我认为问题是因为nestedScrollView. 那么我怎样才能获得visibleItemPosition表单呢recyclerView?谢谢。

小智 7

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

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