RecyclerView精确计算滚动距离

RecyclerView精确计算滚动距离

2023年7月15日发(作者:)

RecyclerView精确计算滚动距离获取RecyclerView滚动距离的⼏种⽅法如下第⼀种 computeVerticalScrollOffset⽅法var dy = eVerticalScrollOffset()当RecyclerView的每个item⾼度都相同时,能正确的获取到滚动的距离dy,但是当每个item⾼度不⼀致时,获取到的值是不正确的,具体原因可以看computeVerticalScrollOffset⽅法的源码。第⼆种 通过OnScrollListene监听累加crollListener(object : llListener(){ var mDy = 0 override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { lled(recyclerView, dx, dy) mDy += dy } })这种⽅法在⼀般情况下也能正确的获得滚动的距离dy,但是当RecyclerView的item有变多或变少但是不触发OnScrollListener的时候,累加的mDy就会有误差。例如:使⽤ItemInserted(0)和ItemRemoved(0)⽅法第三种 继承LayoutManager⾃⼰计算GridLayoutManager如下class OffsetGridLayoutManager( context: Context?, spanCount: Int, orientation: Int, reverseLayout: Boolean) : GridLayoutManager(context, spanCount, orientation, reverseLayout) { private val heightMap = HashMap() override fun onLayoutCompleted(state: ?) { utCompleted(state) val firstVisible = findFirstVisibleItemPosition() val lastVisible = findLastVisibleItemPosition() if (firstVisible >= 0 && lastVisible >= 0 && lastVisible >= firstVisible) { for (i in firstVisible until lastVisible) { getChildAt(i)?.let { val layoutParams = Params as LayoutParams if (dex == 0) { //每⾏的最左边⼀个,⼀⾏只累加⼀个⾼度 heightMap[i] = } else { heightMap[i] = 0 } } } } } override fun computeVerticalScrollOffset(state: ): Int { if (childCount == 0) return 0 return try { val firstVisiblePosition = findFirstVisibleItemPosition() val viewByPosition = findViewByPosition(firstVisiblePosition) var offset = 0 for (i in 0 until firstVisiblePosition) { offset += heightMap[i] ?: 0 } offset -= viewByPosition?.top ?: 0 offset } catch (e: Exception) { 0 } }}重写onLayoutCompleted⽅法并保存每⼀个View的⾼度(⼀⾏有多列的时候,只保存第⼀列view的⾼度,其他view的⾼度记录为0,因为不管⼀⾏有⼏列,⾏的⾼度都只会有⼀个view⾼度)然后重写computeVerticalScrollOffset⽅法,计算⾼度。取得当前第⼀个可见的view的position,将该view前⾯所有view的⾼度累加,再加上该view向上滚动的距离,就是最终的滚动距离同理LinearLayoutManager的话修改onLayoutCompleted就可以class OffsetLinearLayoutManager( context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : LinearLayoutManager(context, attrs, defStyleAttr, defStyleRes) { private val heightMap = HashMap() override fun onLayoutCompleted(state: ?) { utCompleted(state) val firstVisible = findFirstVisibleItemPosition() val lastVisible = findLastVisibleItemPosition() if (firstVisible >= 0 && lastVisible >= 0 && lastVisible >= firstVisible) { for (i in firstVisible until lastVisible) { getChildAt(i)?.let { heightMap[i] = } } } } override fun computeVerticalScrollOffset(state: ): Int { if (childCount == 0) return 0 return try { val firstVisiblePosition = findFirstVisibleItemPosition() val viewByPosition = findViewByPosition(firstVisiblePosition) var offset = 0 for (i in 0 until firstVisiblePosition) { offset += heightMap[i] ?: 0 } offset -= viewByPosition?.top ?: 0 offset } catch (e: Exception) { 0 } }}

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689430810a247075.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信