我正在尝试做这样的事情:
RecyclerAdapter recyclerAdapter;
LinearLayoutManager recyclerManager;
//set items....
recyclerAdapter.notifyDataSetChanged();
int itemPosition = recyclerManager.findFirstVisibleItemPosition(); //returns -1
但屏幕上显然有新项目。来自docs https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager.html#findFirstVisibleItemPosition(),我看到这个:
返回第一个可见视图的适配器位置。此位置不包括在最后一次布局传递后调度的适配器更改。
所以我认为布局过程还没有完成。但我不知道如何确保在调用此方法之前完成它。我什至尝试过这个:
if (!isInLayout()) {
recyclerManager.requestLayout();
}
在调用该方法之前,但这没有帮助。谢谢你的帮助。
您是正确的,问题是尚未发生布局传递,这就是您得到的原因POSITION_NONE
.
只需进行检查即可if (!isInLayout())
不会起作用,因为你只会做一次检查,它会返回 false,然后就结束了。
在这种情况下你真正想做的是使用ViewTreeObserver https://developer.android.com/reference/android/view/ViewTreeObserver.html监听布局事件。
例如:
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int itemPosition = recyclerManager.findFirstVisibleItemPosition();
}
});
顺便说一句,如果您只使用findFirstVisibleItemPosition()
第一次填充 RecyclerView 时,您可能根本不需要它。第一个可见项将始终为 0,除非您还执行其他操作来滚动 RecyclerView。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)