利用SnapHelper配合LinearLayoutManager来实现自动循环滚动 提高性能
class LoopSnapHelper : SnapHelper() {
override fun findTargetSnapPosition(layoutManager: RecyclerView.LayoutManager?, velocityX: Int, velocityY: Int): Int? {
// 这里可以根据需要调整,实现循环滚动的逻辑
// 例如,根据velocity判断滚动方向,然后返回相应的position
return super.findTargetSnapPosition(layoutManager, velocityX, velocityY)
}
override fun calculateDistanceToFinalSnap(layoutManager: RecyclerView.LayoutManager?, targetView: View?): IntArray? {
// 可选:根据需要调整滚动到中心的逻辑
return super.calculateDistanceToFinalSnap(layoutManager, targetView)
}
}
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
// 初始化自定义的SnapHelper并附加到RecyclerView
val snapHelper = LoopSnapHelper()
snapHelper.attachToRecyclerView(recyclerView)
val adapter = BannerAdapter(yourDataList) // yourDataList是实际的数据集
recyclerView.adapter = adapter
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition()
val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
val itemCount = layoutManager.itemCount
// 当滑动到接近开始或结束时,快速滚动到列表的另一端
if (firstVisibleItemPosition == 0 && dx > 0) {
recyclerView.scrollToPosition(itemCount - 1)
} else if (lastVisibleItemPosition == itemCount - 1 && dx < 0) {
recyclerView.scrollToPosition(0)
}
}
})