美文网首页
使用LinearSnapHelper后导致LayoutManag

使用LinearSnapHelper后导致LayoutManag

作者: 御坂七十一号 | 来源:发表于2024-02-18 11:16 被阅读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+。实际上并没有完全滑出显示范围。

    相关文章

      网友评论

          本文标题:使用LinearSnapHelper后导致LayoutManag

          本文链接:https://www.haomeiwen.com/subject/lftmadtx.html