首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在RecyclerView中获取可见项目

在RecyclerView中获取可见项目
EN

Stack Overflow用户
提问于 2014-07-28 14:00:47
回答 9查看 241.6K关注 0票数 306

我需要知道哪些元素当前显示在我的RecyclerView中。在ListViews上没有与OnScrollListener.onScroll(...)方法等效的方法。我尝试过使用View.getGlobalVisibleRect(...),但是这个技巧太难看了,而且并不总是有效的。

有人有什么想法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-07-31 15:50:49

第一个/最后一个可见的子级取决于LayoutManager。如果使用的是LinearLayoutManagerGridLayoutManager,则可以使用

int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

例如:

GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager());
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();

对于LinearLayoutManager,first/last取决于适配器顺序。不要从RecyclerView查询子对象;LayoutManager可能更喜欢布局比可见项更多的项来进行缓存。

票数 641
EN

Stack Overflow用户

发布于 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"));
                        }
                }
            });
        }
    }
票数 22
EN

Stack Overflow用户

发布于 2014-07-28 14:47:54

您可以使用recyclerView.getChildAt()来获取每个可见的子级,在适配器代码中的这些视图上设置一些标记convertview.setTag(index)将有助于您将其与适配器数据相关联。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24989218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档