使用LinearSnapHelper后导致LayoutManag

2024-02-18  本文已影响0人  御坂七十一号

当我使用了LinearSnapHelper 让手指送开后,让中间的item显示为居中后。
LinearLayoutManager.findFirstVisibleItemPosition() 获取的第一个显示的item并不是肉眼看到的item.
测试代码为:

rvYear.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                val position = yearLinearLayoutManager.findFirstVisibleItemPosition() // 获取第一个可见view
                val itemView = yearLinearLayoutManager.findViewByPosition(position)
                val itemHeight: Int = itemView?.height ?: 0 //第一个可见view的高度
                val offset = (itemView?.top?.absoluteValue?.toFloat() ?: 0f) / itemHeight
                Log.i("TAG", "itemView?.offset=" + offset)
                adapterYear.setSelected(position, offset)
            }

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                Log.d(
                    "TAG", "newState=$newState,SCROLL_STATE_IDLE=${SCROLL_STATE_IDLE}, SCROLL_STATE_DRAGGING=$SCROLL_STATE_DRAGGING " +
                            "or SCROLL_STATE_SETTLING=$SCROLL_STATE_SETTLING."
                )
                if (newState == SCROLL_STATE_IDLE) {
                    //滚动停止
//                    contextScope.launch(Dispatchers.IO) {
//                        delay(1000)
//                        launch(Dispatchers.Main) {
//
//                        }
//                    }
                    var position = yearLinearLayoutManager.findFirstVisibleItemPosition() // 获取第一个可见view
                    val itemView = yearLinearLayoutManager.findViewByPosition(position)
                    val itemHeight: Int = itemView?.height ?: 0 //第一个可见view的高度
                    val offset = (itemView?.top?.absoluteValue?.toFloat() ?: 0f) / itemHeight
                    Log.i("TAG", "2222itemView?.offset=" + offset)
//                    2222itemView?.offset=0.990099
//                    222firstVisiblePosition=1,selectedFirstPosition=0
//                    !!!巨坑,LinearSnapHelper 这个滚动并不精准,会导致偏移量为0.99+,但上一个item并没有完全出去。
                    if (offset > 0.9) {
                        position++
                    }
                    adapterYear.setSelected(position)

                }
            }
        })

日志中可看到滚动结束后findFirstVisibleItemPosition获取的和看到的item并不是同一个,获取的item偏移量为0.99+。实际上并没有完全滑出显示范围。

上一篇 下一篇

猜你喜欢

热点阅读