Android 使用 RecyclerView 实现banner

发布于:2024-06-25 ⋅ 阅读:(143) ⋅ 点赞:(0)

利用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)
        }
    }
})


网站公告

今日签到

点亮在社区的每一天
去签到