Take a screenshot of the RecyclerView in the full version. Each item has a list.

I use recyclerView with dynamic size lists ... and when I use this method to take a screenshot of each recyclerView element .. it takes a screenshot, but each element contains only one list item each .. even if the item size > 1 list.

 public static Bitmap getRecyclerViewScreenshot(RecyclerView view) { int size = view.getAdapter().getItemCount(); RecyclerView.ViewHolder holder = view.getAdapter().createViewHolder(view, 0); view.getAdapter().onBindViewHolder(holder, 0); ArrayList<Bitmap> bitmaps=new ArrayList<>(); holder.itemView.measure(View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(), holder.itemView.getMeasuredHeight()); Bitmap bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), holder.itemView.getMeasuredHeight() * size, Bitmap.Config.ARGB_8888); Canvas bigCanvas = new Canvas(bigBitmap); bigCanvas.drawColor(Color.WHITE); Paint paint = new Paint(); int iHeight = 0; holder.itemView.setDrawingCacheEnabled(true); holder.itemView.buildDrawingCache(); bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); holder.itemView.setDrawingCacheEnabled(false); holder.itemView.destroyDrawingCache(); iHeight += holder.itemView.getMeasuredHeight(); for (int i = 1; i < size; i++) { view.getAdapter().onBindViewHolder(holder, i); holder.itemView.setDrawingCacheEnabled(true); holder.itemView.buildDrawingCache(); bitmaps.add(holder.itemView.getDrawingCache()); bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); iHeight += holder.itemView.getMeasuredHeight(); holder.itemView.setDrawingCacheEnabled(false); holder.itemView.destroyDrawingCache(); } return bigBitmap; } Here is my screenshot attached (`of each item of recyclerView`)!! It should show `two items` but uniformly its showing `1 item` each ` I am facing problem with the `inner listView` 

Original : - enter image description here

Screenshot : - enter image description here

An example is displayed for each recycler item snapshot of only 1 .

+7
android listview android-recyclerview
source share
2 answers

This may solve the problem,

I created the bmOverlay bitmap to draw bitmaps from this bitmap. In addition, I took another For loop to create a bitmap for the list items.

Here are the changes I made to your code:

 public Bitmap getRecyclerViewScreenshot(RecyclerView view) { int size = view.getAdapter().getItemCount(); RecyclerView.ViewHolder holder = view.getAdapter().createViewHolder(view, 0); view.getAdapter().onBindViewHolder(holder, 0); holder.itemView.measure(View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); holder.itemView.layout(0, 0, holder.itemView.getMeasuredWidth(), holder.itemView.getMeasuredHeight()); Bitmap bigBitmap = Bitmap.createBitmap(view.getMeasuredWidth(), holder.itemView.getMeasuredHeight() * size, Bitmap.Config.ARGB_8888); Canvas bigCanvas = new Canvas(bigBitmap); bigCanvas.drawColor(Color.WHITE); Paint paint = new Paint(); int iHeight = 0; holder.itemView.setDrawingCacheEnabled(true); holder.itemView.buildDrawingCache(); bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); holder.itemView.setDrawingCacheEnabled(false); holder.itemView.destroyDrawingCache(); iHeight += holder.itemView.getMeasuredHeight(); //Create bitmap to draw both recycler bitmap and listview Bitmap bmOverlay = Bitmap.createBitmap(bigBitmap.getWidth(), bigBitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmOverlay); HashMap<Integer, List<Bitmap>> bmp = recommendTestAdapter.getBmp(); HashMap<Integer, Integer> height = recommendTestAdapter.getHeight(); HashMap<Integer, Integer> width = recommendTestAdapter.getWidth(); for (int i = 1; i < size; i++) { view.getAdapter().onBindViewHolder(holder, i); holder.itemView.setDrawingCacheEnabled(true); holder.itemView.buildDrawingCache(); List<Bitmap> bitmapList = bmp.get(i); int allHeight = height.get(i); int listViewWidth = width.get(i); Bitmap smallBitmap = Bitmap.createBitmap(listViewWidth, allHeight, Bitmap.Config.ARGB_8888); Canvas smallCanvas = new Canvas(smallBitmap); paint = new Paint(); int iListHeight = 0; for (int j = 0; j < bitmapList.size(); j++) { Bitmap bmpList = bitmapList.get(j); smallCanvas.drawBitmap(bmpList, 0, iListHeight, paint); iListHeight += bmpList.getHeight(); bmpList.recycle(); } bigCanvas.drawBitmap(holder.itemView.getDrawingCache(), 0f, iHeight, paint); bigCanvas.drawBitmap(smallBitmap, 0f, iListHeight, paint); iHeight += holder.itemView.getMeasuredHeight(); holder.itemView.setDrawingCacheEnabled(false); holder.itemView.destroyDrawingCache(); canvas.drawBitmap(bigBitmap, new Matrix(), null); canvas.drawBitmap(smallBitmap, new Matrix(), null); return bmOverlay; } return bigBitmap; } 

Here is my RecycleView adapter,

 public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.viewHolder> { private Context context; private ArrayList<RecyclerData> recyclerData; private ListViewAdapter listAdapter; private HashMap<Integer, List<Bitmap>> bmp = new HashMap<>(); private HashMap<Integer, Integer> height = new HashMap<>(); private HashMap<Integer, Integer> width = new HashMap<>(); public RecyclerAdapter(Context context, ArrayList<RecyclerData> recyclerData) { this.context = context; recyclerData = recyclerData; } @Override public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false); return new viewHolder(view); } @Override public void onBindViewHolder(final viewHolder holder, final int position) { listAdapter = new ListViewAdapter(context); holder.listView.setAdapter(listAdapter); List<Bitmap> bitmapList = new ArrayList<>(); int allItemsHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View childView = listAdapter.getView(i, null, holder.listView); childView.measure(View.MeasureSpec.makeMeasureSpec(holder.listView.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight()); childView.setDrawingCacheEnabled(true); childView.buildDrawingCache(); bitmapList.add(childView.getDrawingCache()); allItemsHeight+=childView.getMeasuredHeight(); } width.put(position, holder.listView.getMeasuredWidth()); height.put(position, allItemsHeight); bmp.put(position, bitmapList); } public HashMap<Integer, List<Bitmap>> getBmp() { return bmp; } public void setBmp(HashMap<Integer, List<Bitmap>> bmp) { this.bmp = bmp; } public HashMap<Integer, Integer> getHeight() { return height; } public void setHeight(HashMap<Integer, Integer> height) { this.height = height; } public HashMap<Integer, Integer> getWidth() { return width; } public void setWidth(HashMap<Integer, Integer> width) { this.width = width; } @Override public int getItemCount() { return recyclerData.size(); } class viewHolder extends RecyclerView.ViewHolder { private ListView listView; viewHolder(View itemView) { super(itemView); listView = itemView.findViewById(R.id.listview); } } } 
0
source share

Why should you draw each element to create a screenshot?

Case 1 : your RecyclerView is static (show the whole element, scroll with the parent - NestedScrollView ), recyclerView.setNestedScrollingEnabled (false);
If you complete this case, you do not need to draw each element, just select the root mode:

 public static Bitmap takeScreenShot(View view) { Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); view.draw(c); return b; } 

Case 2 Your RecyclerView still allows the recycling technique, if we use your solution when the list contains many elements (for example, 100 elements), the screenshot will look very different with the actual user view, it is also a very tall and ugly bitmap .

I checked your code, it works, but for me it does not make sense.

0
source share

All Articles