超简单的RecyclerView item自下往上无限循环滑动

效果

 

 companion object {
        val TAG = "Main"
    }


    private val adapter by lazy {
        object : BaseQuickAdapter<Int, BaseViewHolder>(R.layout.item_layout) {
            override fun convert(helper: BaseViewHolder?, item: Int?) {
                helper?.itemView?.apply {
                    textView.text = "hello world$item"
                }
            }

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

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

            override fun getItemViewType(position: Int): Int {
                var count = headerLayoutCount + data.size
                if (count <= 0) {
                    count = 1
                }
                return super.getItemViewType(position % count)
            }
        }
    }

    var handler = Handler()
    var currentInt = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_camrea)

        recyclerView.layoutManager = linearLayoutManager
        recyclerView.setHasFixedSize(true)

        recyclerView.adapter = adapter
        adapter.setNewData(
            listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
        )

        //PagerSnapHelper().attachToRecyclerView(recyclerView)

        play()

        recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                play()
            }

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                
                /*if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    play()
                }*/
                
            }
        })
        
        /*var animator=ValueAnimator.ofInt(0,recyclerView.height)
        animator.duration=2000
        animator.addUpdateListener { 
            var a=it.animatedValue as Int
            recyclerView.translationY=-a.toFloat()
            recyclerView.requestLayout()
        }
        animator.repeatMode=ValueAnimator.REVERSE
        animator.repeatCount=ValueAnimator.INFINITE
        animator.start()*/

    }

    private fun play() {
        currentInt++
        recyclerView.smoothScrollToPosition(currentInt)
        /*handler.postDelayed({
            currentInt++
            //recyclerView.scrollToPosition(currentInt)
            recyclerView.smoothScrollToPosition(currentInt)
//            val layoutManager = recyclerView.layoutManager as LinearLayoutManager
//            layoutManager.scrollToPositionWithOffset(currentInt, 0)
        }, 2000)*/
    }
    var linearLayoutManager: LinearLayoutManager = object : LinearLayoutManager(this) {
        override fun smoothScrollToPosition(
            recyclerView: RecyclerView,
            state: RecyclerView.State,
            position: Int
        ) {
            val smoothScroller: LinearSmoothScroller =
                object : LinearSmoothScroller(recyclerView.context) {
                    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics): Float {
                        // 返回:滑过1px时经历的时间(ms)。                                                                              
                        return 20000f / displayMetrics.densityDpi
                    }

                    override fun calculateDtToFit(
                        viewStart: Int,
                        viewEnd: Int,
                        boxStart: Int,
                        boxEnd: Int,
                        snapPreference: Int
                    ): Int {
                        return boxStart - viewStart
                    }
                }
            smoothScroller.targetPosition = position
            startSmoothScroll(smoothScroller)
            
        }
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值