android - Recycle View scrolls slow . How to fix it? -


i implemented expandable layout in recycle view .expandablelayout library

issue : recycle view scroll slow @ first time . expand/collpase working list scroll slow

note : its working smoothly on 4 gb ram device laggy scroll on 2 gb ram device . tested moto g3 (2 gb ram) , moto g5 plus (4 gb ram)

data coming web-service , passing array-list through adapter.

layout row file (xml) in nested linear layouts. (may viewgroups load tried constraint layout .still recycleview load laggy)

i replacing view during expansion , collapse item view (i commented code. still recycle view slow ) there no use of image storing in itemview . tried sethasfixedsize , notifydatachanged , setcache , adapter.sethasstableids(true);

but still recycleview loads laggy @ first time .

help me fix issue. still finding issue ! can check adapter code!

public class pendingordersadapter extends recyclerview.adapter<pendingordersadapter.viewholder> {  public layoutinflater minflater; public hashset<integer> mexpandedpositionset = new hashset<>(); context context; arraylist<customerdetails> list; customerdetails details;   public pendingordersadapter(context context, arraylist<customerdetails> list) { this.context = context; this.list = list; this.minflater = layoutinflater.from(context); }  @override public viewholder oncreateviewholder(viewgroup parent, int viewtype) { view item = minflater.inflate(r.layout.pending_order_item, parent, false); return new viewholder(item); }   @override public void onbindviewholder(final viewholder holder, final int position) {  details = list.get(position);  holder.updateitem(position, holder); holder.tvorderno.settext("" + details.getorderid()); holder.tvcustomername.settext("" + details.getcustomername()); holder.tvtotalprice.settext("" + details.gettotalprice()); holder.tvcustomercontactno.settext("" + details.getprimarycontactno()); holder.tvproductweight.settext("" + details.getproductweight()); holder.tvcustomerstatus.settext("" + details.getcustomerstatus()); holder.tvdeliverymanstatus.settext("" + details.getdeliverymanstatus()); holder.tvaddress.settext("" + details.getaddress()); holder.tvdeliveryman.settext("" + details.getcustomername() + " ( " + details.getprimarycontactno() + " ) "); holder.tvtime.settext("" + details.gettime()); holder.tvpickupdate.settext("" + details.getpickupdate());  holder.tvdeliverycharge.settext("" + details.getdeliverycharge());   //opening dialogfragment on click listner    holder.tvdeliveryman.setonclicklistener(new view.onclicklistener() {     @override     public void onclick(view v) {         appcompatactivity activity = (appcompatactivity) (context);          android.app.fragmenttransaction ft = activity.getfragmentmanager().begintransaction();         android.app.fragment prev = activity.getfragmentmanager().findfragmentbytag("dvdialog");          if (prev != null) {             ft.remove(prev);         }         ft.addtobackstack(null);          deliverymandetailsdialog newfragment = new deliverymandetailsdialog();         newfragment.show(ft, "dvdialog");      } });  holder.tvaddress.setontouchlistener(new view.ontouchlistener() {     @override     public boolean ontouch(view v, motionevent event) {          final int drawable_right = 2;           //address icon click listner right side          if (event.getaction() == motionevent.action_up) {             if (event.getrawx() >= (holder.tvaddress.getright() - holder.tvaddress.getcompounddrawables()[drawable_right].getbounds().width())) {                  // action here                 intent intent = new intent(context, routeactivity.class);                 intent.putextra("custlat", details.getcustlatitude());                 intent.putextra("custlong", details.getcustlongitude());                 intent.putextra("bolat", details.getbolatitude());                 intent.putextra("bolong", details.getboslongitude());                  context.startactivity(intent);               }               return true;          }         return true;     } });   }  @override public int getitemviewtype(int position) { return position; }  @override public int getitemcount() { return list.size(); }  public void registerexpand(int position, viewholder holder) {  if (mexpandedpositionset.contains(position)) {      //replacing views @ runtime , arrow animation      viewgrouputils.replaceview(holder.timelayout, holder.statuslayout);   holder.orderbox.setbackgroundresource(r.drawable.box_fill_drawable);     holder.ivarrow.animate().rotation(360).start();     removeexpand(position);     } else {     viewgrouputils.replaceview(holder.statuslayout, holder.timelayout);      holder.orderbox.setbackgroundresource(r.drawable.box_fill_drawable_top);     holder.ivarrow.animate().rotation(180).start();     addexpand(position);   } }  public void removeexpand(int position) {   mexpandedpositionset.remove(position);   }  public void addexpand(int position) {   mexpandedpositionset.add(position);  }  public class viewholder extends recyclerview.viewholder { public expandablelayout expandablelayout; public linearlayout orderbox, orderbox_bottom; public imageview ivarrow; public textview tvaddress, tvorderno, tvcustomername, tvtotalprice, tvcustomercontactno; public textview tvproductweight, tvcustomerstatus, tvdeliverymanstatus; public textview tvdeliverycharge, tvdeliveryman, tvtime; public textview tvpickupdate; public linearlayout statuslayout, statusparentlayout, timelayout, timeparentlayout, addresslayout;   public viewholder(final view itemview) {     super(itemview);     expandablelayout = (expandablelayout)  itemview.findviewbyid(r.id.expandable_layout);     orderbox = (linearlayout) itemview.findviewbyid(r.id.orderbox);      orderbox_bottom = (linearlayout)  itemview.findviewbyid(r.id.orderbox_bottom);     ivarrow = (imageview) itemview.findviewbyid(r.id.ivarrow);      tvorderno = (textview) itemview.findviewbyid(r.id.tvorderno);     tvcustomername = (textview)  itemview.findviewbyid(r.id.tvcustomername);     tvtotalprice = (textview)  itemview.findviewbyid(r.id.tvtotalprice);     tvcustomercontactno = (textview)  itemview.findviewbyid(r.id.tvcustomercontactno);     tvproductweight = (textview)  itemview.findviewbyid(r.id.tvproductweight);     tvcustomerstatus = (textview)  itemview.findviewbyid(r.id.tvcustomerstatus);     tvdeliverymanstatus = (textview)  itemview.findviewbyid(r.id.tvdeliverymanstatus);     tvdeliverycharge = (textview)  itemview.findviewbyid(r.id.tvdeliverycharge);     tvaddress = (textview) itemview.findviewbyid(r.id.tvaddress);     tvdeliveryman = (textview)  itemview.findviewbyid(r.id.tvdeliveryman);     tvtime = (textview) itemview.findviewbyid(r.id.tvtime);     tvpickupdate = (textview)  itemview.findviewbyid(r.id.tvpickupdate);      statusparentlayout = (linearlayout)  itemview.findviewbyid(r.id.statusparentlayout);     statuslayout = (linearlayout)  itemview.findviewbyid(r.id.statuslayout);     timeparentlayout = (linearlayout)  itemview.findviewbyid(r.id.timeparentlayout);     timelayout = (linearlayout)  itemview.findviewbyid(r.id.timedatelayout);     addresslayout = (linearlayout)  itemview.findviewbyid(r.id.addresslayout); }  public void updateitem(final int position, final viewholder holder) {     holder.orderbox.setbackgroundresource(r.drawable.box_fill_drawable_top);     holder.expandablelayout.setonexpandlistener(new expandablelayout.onexpandlistener() {         @override         public void onexpand(boolean expanded) {              registerexpand(position, holder);          }     });      expandablelayout.setexpand(mexpandedpositionset.contains(position));  } } 

calling adapter fragment

**  pendingordersadapter adapter = new pendingordersadapter(getactivity(), detailsarraylist);      recyclerview.setlayoutmanager(new linearlayoutmanager(getactivity()));     recyclerview.setitemanimator(new defaultitemanimator());     recyclerview.sethasfixedsize(true);     recyclerview.setitemviewcachesize(20);     recyclerview.setdrawingcacheenabled(true);  recyclerview.setdrawingcachequality(view.drawing_cache_quality_high);     recyclerview.setadapter(adapter);     adapter.notifydatasetchanged();** 

expanded recycleview itemview

make 1 class, example, util , added method class , use it.

 public static void setdivider(context context, recyclerview recyclerview, recyclerview.layoutmanager layoutmanager) {             recyclerview.setlayoutmanager(layoutmanager);             recyclerview.setitemanimator(new defaultitemanimator());             recyclerview.sethasfixedsize(true);             recyclerview.setitemviewcachesize(20);             recyclerview.setdrawingcacheenabled(true);             recyclerview.setdrawingcachequality(view.drawing_cache_quality_high);             divideritemdecoration horizontaldecoration = new divideritemdecoration(recyclerview.getcontext(), divideritemdecoration.vertical);             drawable horizontaldivider = contextcompat.getdrawable(context, r.drawable.horizontal_divider);             horizontaldecoration.setdrawable(horizontaldivider);             recyclerview.additemdecoration(horizontaldecoration);         } 

here first parameter context, second 1 pass recyclerview , third 1 pass layout manager. if have more stuff change cachesize


Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -