获取不到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
}