• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

RecyclerView 自动循环滚动

武飞扬头像
zh刺客
帮助1

RecyclerView 自动循环滚动

RecyclerView 自动循环滚动

在最近一次开发中,需要用到文章的自动滚动功能,看了其他资料结合需要,总结了一下

自定义 AutoScrollRecyclerView

class AutoScrollRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
    private var mAutoTask: Disposable? = null
    fun start() {
        if (mAutoTask != null && !mAutoTask!!.isDisposed) {
            mAutoTask!!.dispose()
        }
        /**
         * @param initialDelay 第一次执行的延迟时间
         * @param period 每次执行的间隔的时间
         * @param unit 时间单位
         * @param scheduler 线程调度器
         * @return Observable对象
         */
        mAutoTask = Observable.interval(3000, 300, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { //垂直自动滑动y轴40
                    smoothScrollBy(0, 40)
                }
    }

    fun stop() {
        if (mAutoTask != null && !mAutoTask!!.isDisposed) {
            mAutoTask!!.dispose()
            mAutoTask = null
        }
    }

    //禁止手动滑动
    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        return true
    }
}
学新通

自定义NoticeRecyclerViewAdapter使用

/**
 * @Description: 描述
 * @author: zhanghuaiwang
 * @date: 22-2-22
 */
class NoticeRecyclerViewAdapter(data: List<String?>?) : BaseQuickAdapter<String?, BaseViewHolder?>(R.layout.tip_adapter_item, data) {
    override fun convert(helper: BaseViewHolder?, item: String?) {
        helper?.setText(R.id.it_tv, item)
    }

    override fun getItem(position: Int): String? {
        val newPosition = position % data.size
        return data[newPosition]
    }

    override fun getItemViewType(position: Int): Int {
        //count为0。就会出现0%0的情况,这会抛出异常
        var conut: Int = headerLayoutCount   data.size
        if (conut <= 0) {
            conut = 1
        }
        var newPosition = position % conut
        return super.getItemViewType(newPosition)
    }

    override fun getItemCount(): Int {
        return Int.MAX_VALUE
    }
}
学新通

最后使用

class Main2Activity : AppCompatActivity() {

    private var mRv: AutoScrollRecyclerView? = null
    private var mRv1: AutoScrollRecyclerView? = null
    private var data: MutableList<String> = ArrayList<String>()
    private var mAdapter: NoticeRecyclerViewAdapter? = null
    private var smoothScroller: LinearSmoothScroller? = null
    private var mAutoTask: Disposable? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)
        initData()
        initView()
    }


    private fun initView() {
        mRv = findViewById(R.id.am_rv)
        mRv1 = findViewById(R.id.am_rv1)
        mAdapter = NoticeRecyclerViewAdapter(data)
        var layoutManager: LinearLayoutManager = LinearLayoutManager(this)
        var decoration: DividerItemDecoration = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
        mRv?.layoutManager = layoutManager
        mRv?.addItemDecoration(decoration)
        mRv?.adapter = mAdapter

        mRv1?.layoutManager = layoutManager
        mRv1?.addItemDecoration(decoration)
        mRv1?.adapter = mAdapter

        smoothScroller = object : LinearSmoothScroller(this) {
            override fun getVerticalSnapPreference(): Int {
                return SNAP_TO_START
            }

            override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
                return 3f / displayMetrics!!.density
            }
        }

    }

    private fun initData() {
        for (i in 0..9) {
            data.add("测试机$i")
        }
    }

    private fun startAuto() {
        if (mAutoTask != null && !mAutoTask!!.isDisposed) {
            mAutoTask!!.dispose()
        }
        mAutoTask = Observable.interval(500, 200, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe() {
                    //滚动到指定Item
                    smoothScroller?.targetPosition = it.toInt()
                    mRv?.layoutManager?.startSmoothScroll(smoothScroller)
                }
    }

    private fun stopAuto() {
        if (mAutoTask != null && !mAutoTask!!.isDisposed) {
            mAutoTask!!.dispose()
            mAutoTask = null
        }
    }

    override fun onStart() {
        super.onStart()
        //开始滚动
        startAuto()
        //流式滚动效果
        mRv1?.start()
    }

    override fun onStop() {
        super.onStop()
        //结束滚动
        stopAuto()
        mRv1?.stop()
    }
}
学新通

##就是这么简单

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgccefa
系列文章
更多 icon
同类精品
更多 icon
继续加载