android 实现无限循环轮播

一丶不多说废话,直接看图效果

二丶核心就是一个recyclerview,其本身就有一个 smoothScrollToPosition()滑动到指定的位置,但是这个过程很快,不是我们想要的效果, 这个方法里面最终调用的是LinearLayoutManager的smoothScrollToPosition()方法,所以我们需要重写LinearLayoutManager的smoothScrollToPosition()方法来控制滑动速度,接下来上代码:

import android.content.Context
import android.graphics.PointF
import android.util.DisplayMetrics
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSmoothScroller
import androidx.recyclerview.widget.RecyclerView

class AutoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) {
    //  控制水平滚动速度
    override fun smoothScrollToPosition(recyclerView: RecyclerView, state: RecyclerView.State, position: Int) {
        val linearSmoothScroller: LinearSmoothScroller = object : LinearSmoothScroller(recyclerView.context) {
            override fun computeScrollVectorForPosition(targetPosition: Int): PointF? {
                return this@AutoScrollLayoutManager.computeScrollVectorForPosition(targetPosition)
            }

            override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
                // 计算滑动每个像素需要的时间,这里应该与屏幕适配;
                return 40f / displayMetrics.density
            }
        }
        linearSmoothScroller.targetPosition = position
        startSmoothScroll(linearSmoothScroller)
    }
}

三丶为了实现一直滚动下去,所以需要在adapter中返回itemCount为Int.MAX_VALUE:

override fun getItemCount(): Int {
            return if (mDataList.isNotEmpty()) Int.MAX_VALUE else 0
        }

三丶然后像普通的LinearLayoutManager设置给Recyclerview,再给Recyclerview设置Adapter之后调用Recyclerview.smoothScrollToPosition(Int.MAX_VALUE),注意看标红这里是Int的最大值,也就是一直滚动下去,那么问题来了,数据是有限的,所以就需要实现数据循环,在adapter的onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)方法里面,我们用自定义的index来获取下个位置的数据对象,每当index为数据的数量的长度时说明需要重新循环,所以重新设置index为0,代码如下:

 var index = 0
 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
                    if (index % (mDataList.size - 1) == 0){
                        // 数据进行下一次的循环
                        index = 0
                    }
                    val horizontalGame = mDataList[index++]
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值