Проблема
Я написал код для создания полноразмерных скриншотов RecyclerView
который почти работает, но каким-то образом последний элемент списка отображается поверх списка.
Я сильно подозреваю, что ошибка возникает в этом блоке кода, где происходит прорисовка каждого элемента списка
int viewHolderTopPadding = 0;
for (int i = 0; i < itemCount; i++) {
recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
viewHolder.itemView.draw(canvas);
canvas.drawBitmap(recyclerViewBitmap,0f, viewHolderTopPadding, null);
viewHolderTopPadding += measuredItemHeight;
}
Но если я использую устаревший подход для сохранения видов в растровые изображения, то он работает правильно:
for (int i = 0; i < itemCount; i++) {
recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
viewHolder.itemView.setDrawingCacheEnabled(true);
viewHolder.itemView.buildDrawingCache();
canvas.drawBitmap(viewHolder.itemView.getDrawingCache(), 0f, viewHolderTopPadding, null);
viewHolderTopPadding += measuredItemHeight;
viewHolder.itemView.setDrawingCacheEnabled(false);
viewHolder.itemView.destroyDrawingCache();
}
Остальной код
private Bitmap generateLongBitmap(RecyclerView recyclerView) {
int itemCount = recyclerView.getAdapter().getItemCount();
RecyclerView.ViewHolder viewHolder = recyclerView.getAdapter().createViewHolder(recyclerView, 0);
//Measure the sizes of list item views to find out how big itemView should be
viewHolder.itemView.measure(View.MeasureSpec.makeMeasureSpec(recyclerView.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
// Define measured widths/heights
int measuredItemHeight = viewHolder.itemView.getMeasuredHeight();
int measuredItemWidth = viewHolder.itemView.getMeasuredWidth();
//Set width/height of list item views
viewHolder.itemView.layout(0, 0, measuredItemWidth, measuredItemHeight);
//Create the Bitmap and Canvas to draw on
Bitmap recyclerViewBitmap = Bitmap.createBitmap(recyclerView.getMeasuredWidth(), measuredItemHeight * itemCount, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(recyclerViewBitmap);
//Draw RecyclerView Background:
if(recyclerView.getBackground() !=null){
Drawable drawable = recyclerView.getBackground().mutate();
drawable.setBounds(measuredItemWidth,measuredItemHeight * itemCount,0,0);
drawable.draw(canvas);
}
//Draw all list item views
int viewHolderTopPadding = 0;
for (int i = 0; i < itemCount; i++) {
recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
viewHolder.itemView.draw(canvas);
canvas.drawBitmap(recyclerViewBitmap,0f, viewHolderTopPadding, null);
viewHolderTopPadding += measuredItemHeight;
}
return recyclerViewBitmap;
}