我需要知道哪些元素当前显示在我的RecyclerView中。在ListViews上没有与OnScrollListener.onScroll(...)
方法等效的方法。我尝试过使用View.getGlobalVisibleRect(...)
,但是这个技巧太难看了,而且并不总是有效的。
有人有什么想法吗?
发布于 2014-07-31 15:50:49
第一个/最后一个可见的子级取决于LayoutManager
。如果使用的是LinearLayoutManager
或GridLayoutManager
,则可以使用
int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();
例如:
GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
对于LinearLayoutManager
,first/last取决于适配器顺序。不要从RecyclerView
查询子对象;LayoutManager
可能更喜欢布局比可见项更多的项来进行缓存。
发布于 2019-06-03 02:22:11
对于那些要在RecyclerView适配器内部实现逻辑的人,您仍然可以使用@ernesto方法结合on scrollListener来获取what you want
,因为RecyclerView是被咨询的。在适配器内部,您将看到类似如下的内容:
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof LinearLayoutManager && getItemCount() > 0) {
LinearLayoutManager llm = (LinearLayoutManager) manager;
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visiblePosition = llm.findFirstCompletelyVisibleItemPosition();
if(visiblePosition > -1) {
View v = llm.findViewByPosition(visiblePosition);
//do something
v.setBackgroundColor(Color.parseColor("#777777"));
}
}
});
}
}
发布于 2014-07-28 14:47:54
您可以使用recyclerView.getChildAt()
来获取每个可见的子级,在适配器代码中的这些视图上设置一些标记convertview.setTag(index)
将有助于您将其与适配器数据相关联。
https://stackoverflow.com/questions/24989218
复制相似问题