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 on2 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();**
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
Post a Comment