一个页面,根布局就是一个RecyclerView,由几个部分组合,作为item,实现了整个页面。如下图所示:由五个item构成。
可见,不滑动状态下,1 和 2 完全可见,3部分可见,4 和 5完全不可见。
那么此时,有这样一个需求:需要截取1,2,3,4作为图片,实现分享。
分享就不说了,难点在截取1,2,3,4几个view,然后构成图片Bitmap。
具体做法是,通过RecyclerView遍历获取所有子view,得到1,2,3,4四个view。
val rvAdapter = recyclerView.adapter ?: return targetBitmap
val listTotalCount = rvAdapter.itemCount
var itemView: View? = null
//计算高度
for (pos in startIndex until listTotalCount) {
if (pos <= endIndex) {
itemView = getRecyclerViewItem(recyclerView,pos) // 这一步是重点
if (itemView != null) {
//
}
}
}
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
}
// 获取itemView
}
return null
}
遇到的问题是在上述获取itemView处。
我使用了如下几种方法:
1). recyclerView.getChildAt(position) 这个只能获取到可见的item,也就是1,2,3
2). recyclerView.layoutManager?.findViewByPosition(pos) 这个只能获取到可见的item,也就是1,2,3
3). recyclerView.findViewHolderForLayoutPosition(position)?.itemView 这个只能获取到可见的item,也就是1,2,3
4) 这个只能获取到可见的item,也就是1,2,3
val firstItem = layoutManager.findFirstVisibleItemPosition()
val realItemPos = if((position - firstItem)>=0) (position - firstItem) else 0
itemView = recyclerView.getChildAt(realItemPos)
上述四种方法,都只能获取到可见的item,屏幕外的view则始终获取不到。这是由RecyclerView的特性--view缓存复用等所引起的。
*** 解决办法
想了下,ItemView其实都是在Adapter中构造的。那就通过Adapter获取。具体做法如下:
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
}
至此,难点问题已解决!!!剩下的就是将获取的view,构造拼接为一张图片(Bitmap)。