当我使用了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+。实际上并没有完全滑出显示范围。
网友评论