首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在recycleview中找到每个可见项的百分比

如何在recycleview中找到每个可见项的百分比
EN

Stack Overflow用户
提问于 2016-09-15 13:18:50
回答 4查看 5.9K关注 0票数 8
int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();

所有这些方法都是给出哪个项目是可见的,但如何在Recycleview中找到可见项目的百分比?

即findFirstVisibleItemPosition();给出了第一个可见项的位置,但我想在第一个可见项超过50%时执行一些操作

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-15 13:34:16

您需要为recyclerview编写addOnScrollListener(),并在其中编写以下代码,您将在其中获得firstVisibleItem的位置,然后您可以在每个滚动上获得该项目的尺寸。只需将以前的维度保存在全局变量中,并将其与当前维度进行比较,然后计算每次滚动更改时的百分比。当你得到你想要的百分比,然后执行你的操作。

int position = linearLayoutManager.findFirstVisibleItemPosition();
Rect rect = new Rect();
linearLayoutManager.findViewByPosition(position).getGlobalVisibleRect(rect);
票数 9
EN

Stack Overflow用户

发布于 2018-03-08 16:22:38

覆盖recyclerview的ScrollChangedListener并在onScollerdChanged中添加以下代码,以获得行的可见性。

           if (rvPercentage != null){
                LinearLayoutManager layoutManager = ((LinearLayoutManager) rvPercentage.getLayoutManager());

                final int firstPosition = layoutManager.findFirstVisibleItemPosition();
                final int lastPosition = layoutManager.findLastVisibleItemPosition();

                Rect rvRect = new Rect();
                rvPercentage.getGlobalVisibleRect(rvRect);

                for (int i = firstPosition; i <= lastPosition; i++) {
                    Rect rowRect = new Rect();
                    layoutManager.findViewByPosition(i).getGlobalVisibleRect(rowRect);

                    int percentFirst;
                    if (rowRect.bottom >= rvRect.bottom){
                        int visibleHeightFirst =rvRect.bottom - rowRect.top;
                        percentFirst = (visibleHeightFirst * 100) / layoutManager.findViewByPosition(i).getHeight();
                    }else {
                        int visibleHeightFirst = rowRect.bottom - rvRect.top;
                        percentFirst = (visibleHeightFirst * 100) / layoutManager.findViewByPosition(i).getHeight();
                    }

                    if (percentFirst>100)
                        percentFirst = 100;

                    mData.get(i).setPercentage(percentFirst);
                    mAdapter.notifyItemChanged(i);
                }
            }

它会给出以下输出:

票数 26
EN

Stack Overflow用户

发布于 2018-03-15 21:34:34

这是一个改进的(更有效,更少的内存使用,更少的代码,用当前可见性范围更新ViewHolder )的Kotlin版本的Vishal Sanghani's answer

recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
        val layoutManager = recycler.layoutManager as LinearLayoutManager
        val firstPosition = layoutManager.findFirstVisibleItemPosition()
        val lastPosition = layoutManager.findLastVisibleItemPosition()

        val globalVisibleRect = Rect()
        val itemVisibleRect = Rect()

        recycler.getGlobalVisibleRect(globalVisibleRect)

        for (pos in firstPosition..lastPosition) {
            val view = layoutManager.findViewByPosition(pos)
            if (view != null && view.height > 0 && view.getGlobalVisibleRect(itemVisibleRect)) {
                val visibilityExtent = if (itemVisibleRect.bottom >= globalVisibleRect.bottom) {
                    val visibleHeight = globalVisibleRect.bottom - itemVisibleRect.top
                    Math.min(visibleHeight.toFloat() / view.height, 1f)
                } else {
                    val visibleHeight = itemVisibleRect.bottom - globalVisibleRect.top
                    Math.min(visibleHeight.toFloat() / view.height, 1f)
                }

                val viewHolder = recycler.findViewHolderForAdapterPosition(pos) as ViewHolder
                viewHolder.setVisibilityExtent(visibilityExtent)

                // if percentage is needed...
                val percentage = visibilityExtent * 100

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

https://stackoverflow.com/questions/39503595

复制
相关文章

相似问题

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