首页 文章

在RecyclerView中获取可见项目

提问于
浏览
214

我需要知道我的RecyclerView当前显示哪些元素 . ListViews上没有等效的OnScrollListener.onScroll(...)方法 . 我尝试使用View.getGlobalVisibleRect(...),但是这个黑客太丑了,并不总是有用 .

有人有什么想法吗?

4 回答

  • 4

    最后,我找到了一个解决方案,可以从适配器中的onBindViewHolder事件中了解当前项是否可见 .

    关键是LayoutManager中的方法 isViewPartiallyVisible .

    在适配器中,您可以从recyclerView获取LayoutManager,您可以从onAttachedToRecyclerView事件获取该管理器 .

  • 488

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

  • 1

    对于 StaggeredGridLayoutManager 这样做:

    RecyclerView rv = findViewById(...);
    StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...);
    rv.setLayoutManager(lm);
    

    并获得可见的项目视图:

    int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null);
    ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]);
    View itemView = viewHolder.itemView;
    

    记得检查一下是否为空 .

  • 7

    第一个/最后一个可见的孩子取决于 LayoutManager . 如果您使用 LinearLayoutManagerGridLayoutManager ,则可以使用

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

    例如:

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

    对于 LinearLayoutManager ,first / last取决于适配器的排序 . 不要查询来自 RecyclerView 的儿童; LayoutManager 可能更喜欢布局比缓存可见的更多项目 .

相关问题