i using gridlayoutmanager show recyclerview items. have implemented onclick , onlongclick on items
public void onitemclicked(int position) { final squareimageview clickeditem = (squareimageview)(llayout.findviewbyposition(position)); if (actionmode != null) { if(clickeditem.getpaddingleft() == 1) clickeditem.setpadding(7,7,7,7); else clickeditem.setpadding(1,1,1,1); } else { thumbview = (squareimageview)(llayout.findviewbyposition(position)); if (build.version.sdk_int > build.version_codes.ice_cream_sandwich) zoomimagefromthumb(position); else imagefromthumb(position); } } @override public boolean onitemlongclicked(int position) { final squareimageview clickeditem = (squareimageview)(llayout.findviewbyposition(position)); clickeditem.setpadding(7,7,7,7); if (actionmode == null) { actionmode = startsupportactionmode(new actionmodecallback()); actionmode.getmenu().finditem(r.id.menu_remove).seticon(new icondrawable(this, iconify.iconvalue.fa_trash).colorres(r.color.accent_color).actionbarsize()); } return true; } as can see change padding of clicked item @ longclick , @ click if actionmode not null.
everything works intended: if long click first item padding change when scroll bottom of grid padding have shifted bottom image or other random image. again if scroll top, top item have no padding , padding have shifted other random element.
is problem due recycling of elements? how rid of this?
yes. problem due recycling of views , expected behaviour.
it's simple understand this. finite set of views kept in memory when scrolling recycler view. can see, padding applied once, after click. so, happens after view recycled? how system remember add padding again?
so, system redraws view item again calling onbindviewholder() of recyclerviewadapter, view holder could've been of other recycled item. need make sure every time onbindviewholder() called 2 things -
1) set padding if item selected (this ensures selected item gets padding), and
2) set padding 0 if item not selected (this ensures random items don't padding. again, expected since selected item's viewholder may reused unselected item!))
you can use sparsebooleanarray store selected positions , check value in onbindviewholder. remember, need call notifyitemchanged(i) position after click that item redrawn (onbindviewholder() called again).
roughly, can add 2 things adapter's code:
public class myadapter extends recyclerview.adapter<myadapter.viewholder>{ //... private sparsebooleanarray selecteditems = new sparsebooleanarray(); // call onitemlongclicked() public void selectitem(int position){ selecteditems.put(position, true); notifyitemchanged(position); } // call in onitemclicked() check if position selected public boolean isitemselected(int position){ return selecteditems.get(position, false); } @override public void onbindviewholder(final viewholder holder, final int position) { // existing code if(selecteditems.get(position, false)){ holder.itemview.setpadding(7,7,7,7); } else { holder.itemview.setpadding(1,1,1,1); } } }
Comments
Post a Comment