android - RecyclerView of heterogenous layouts is shuffling positions -
well, have recyclerview 2 layout types, looks following:
public class searchkeywordrecycler extends recyclerview.adapter<recyclerview.viewholder> { public static final int type = 1, service = 2; private servicesviewholder serviceviewholder; private servicetypeviewholder servicetypeviewholder; private services services; private context context; private onsearchitemclicklistener onsearchitemclicklistener; public searchkeywordrecycler(services services, onsearchitemclicklistener onsearchitemclicklistener) { this.services = services; this.onsearchitemclicklistener = onsearchitemclicklistener; sethasstableids(true); } @override public int getitemviewtype(int position) { if (services.get(position).getserficetype() == 1) { return type; } else if (services.get(position).getserficetype() == 0) { return service; } return position; } @override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { context = parent.getcontext(); layoutinflater inflater = layoutinflater.from(context); if (viewtype == type) { view v = inflater.inflate(r.layout.item_search_service_type, parent, false); servicetypeviewholder = new servicetypeviewholder(v); return servicetypeviewholder; } else if ((viewtype == service)) { view v2 = inflater.inflate(r.layout.item_search_sevice, parent, false); serviceviewholder = new servicesviewholder(v2); return serviceviewholder; } return null; } @override public long getitemid(int position) { return services.get(position).hashcode(); } @override public void onbindviewholder(recyclerview.viewholder holder, int position) { service service = services.get(position); switch (getitemviewtype(position)) { case type: servicetypeviewholder.setdata(service); break; case service: serviceviewholder.setdata(service); break; default: } } @override public int getitemcount() { return services.size(); } public interface onsearchitemclicklistener { void onclicklistener(int position); } class servicesviewholder extends recyclerview.viewholder implements view.onclicklistener { textview txtviewservice; public servicesviewholder(view itemview) { super(itemview); txtviewservice = butterknife.findbyid(itemview, r.id.service_name); } public void setdata(service service) { txtviewservice.settext(service.getservice_name()); if (service.gettype_name() != null) { txtviewservice.settext(service.gettype_name()); } } @override public void onclick(view v) { onsearchitemclicklistener.onclicklistener(getadapterposition()); } } class servicetypeviewholder extends recyclerview.viewholder { textview txtviewtype; public servicetypeviewholder(view itemview) { super(itemview); txtviewtype = butterknife.findbyid(itemview, r.id.servicetype); } public void setdata(service service) { string name = service.gettype_name(); txtviewtype.settext(service.getservice_name()); } } } the issue items' positions keep shuffling while scrolling recyclerview , needs keep order fixed in view.
as can notice, did used, 1- hasstableids(true) function, 2- used getitemid() suggested @ of satck answers , posts.
what doing wrong? thanks
the issue that, used serviceviewholder instance created mannually perform setdata() function in onminderholder(viewholder holder, int position);
after using holder instance brought me adapter itself, worked fine it's synchronizing holder instance matching position used retrieve object data array.
Comments
Post a Comment