LinearLayoutManager.findFirstVisibleItemPosition() 返回 POSITION_NONE

new*_*ewt 1 android android-layout

我正在尝试做这样的事情:

RecyclerAdapter recyclerAdapter;
LinearLayoutManager recyclerManager;
//set items....
recyclerAdapter.notifyDataSetChanged();
int itemPosition = recyclerManager.findFirstVisibleItemPosition(); //returns -1
Run Code Online (Sandbox Code Playgroud)

但屏幕上显然有新项目。从文档中,我看到了这一点:

返回第一个可见视图的适配器位置。此位置不包括在最后一次布局传递之后调度的适配器更改。

所以我想布局通道还没有完成。但是我不知道如何确保在调用此方法之前完成。我什至试过这个:

if (!isInLayout()) {
    recyclerManager.requestLayout();
}
Run Code Online (Sandbox Code Playgroud)

在调用该方法之前,但这没有帮助。谢谢你的帮助。

Tan*_*.7x 5

您是正确的,问题在于尚未发生布局传递,这就是您获得POSITION_NONE.

简单地做一个像这样的检查是if (!isInLayout())行不通的,因为你会做一次检查,它会返回 false,这就是它的结束。

在这种情况下,您真正​​想做的是使用 aViewTreeObserver来侦听布局事件。

例如:

recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int itemPosition = recyclerManager.findFirstVisibleItemPosition();
        }
});
Run Code Online (Sandbox Code Playgroud)

findFirstVisibleItemPosition()顺便说一句,如果您只在第一次填充 RecyclerView 时使用,您可能根本不需要它。第一个可见项将始终为 0,除非您也在做其他事情来滚动 RecyclerView。