2022-9-9

获取不到RecyclerView不可视的View解决办法

背景:

自定义滑动recyclerView(播放视频同步),当滑动到最后一个非空view时,即视频播放完毕,再次播放时需要滑动到不可视的第一个非空view,由于recyclerView会回收不可见对象,需要重新获取不可视的View

以下:

测量完毕recyclerView的尺寸后改变resourcesViewCreate状态,当测量完毕后进行滑动

//获取RecyclerView的长宽
        resourcesRecyclerView?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                //移除监听者,否则Recycler不显示
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    resourcesRecyclerView?.viewTreeObserver?.removeOnGlobalLayoutListener(this)
                }
                resourcesViewCreated = true
            }
        })

fun scrollToCenter(position: Int) {
        if (!resourcesViewCreated){
            return
        }
        //childViewHalfCount是一半RecyclerView可以存在的最大item个数,同时也是头部空布局的个数
        //考虑几种情况:
        //1.中心位置离头部空布局近,position设置为第一个非空布局,即position = childViewHalfCount
        //2.中心位置离中间非空布局近,position则为该布局位置
        //3.中心位置离尾部空布局近,position设置为最后一个非空布局,即position = RecyclerView总个数 - 尾部空布局个数 - 1,即RecyclerView总个数 - childViewHalfCount - 1
        var pos = position
        pos = if (pos > childViewHalfCount) pos else childViewHalfCount
        pos = if (pos < (resourcesAdapter!!.itemCount - childViewHalfCount - 1)) pos else (resourcesAdapter!!.itemCount - childViewHalfCount - 1)
        var viewByPosition: View? = resourcesRecyclerView!!.layoutManager!!.findViewByPosition(pos)
        Log.i("syf", "$viewByPosition:$pos")
        if (viewByPosition == null) {
            viewByPosition = getRecyclerViewItem(resourcesRecyclerView, pos)
            if (viewByPosition == null){
                return
            }
        }
        var itemLeftToCenter: Int = viewByPosition!!.left - centerToLeftDistance
        var smoothDistance = itemLeftToCenter + viewByPosition.width / 2
        resourcesRecyclerView!!.smoothScrollBy(smoothDistance, 0, DecelerateInterpolator())
        setSelectPosition(pos)
    }

其中,重新获取对象参考了博主「唐人小调」

RecyclerView获取不可见的View_唐人小调的博客-CSDN博客_recycleview获取不可见item


fun getRecyclerViewItem(recyclerView: RecyclerView?,position: Int): View? {
        runSafety {
            if (recyclerView == null || recyclerView.layoutManager == null || recyclerView.adapter == null) {
                return null
            }
            if (position > recyclerView.adapter!!.itemCount) {
                return null
            }
            val viewHolder: RecyclerView.ViewHolder = recyclerView.adapter!!.createViewHolder(recyclerView,recyclerView.adapter!!.getItemViewType(position))
            recyclerView.adapter!!.onBindViewHolder(viewHolder,position)
            viewHolder.itemView.measure(View.MeasureSpec.makeMeasureSpec(recyclerView.width, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
            return viewHolder.itemView
        }
        return null
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值