android - Multiple row layouts using RecyclerView -
according this tutorial, publish json content (result array) on recyclerview in 1 screen.
now, changed json file this:
"page": 1, "results": [ { ... } ], "menus": [ { ... } ] }, "total_results": 5450, "total_pages": 273 } now want import menus array recyclerview on same screen.(at first rows). , after import result array.
menus array has not pagination.
i created model class menu (lastmedicmenu.java).
i noob. now, think must change adapter.
original adapter is:
orginal adapter:
public class medicpaginationadapter extends recyclerview.adapter<recyclerview.viewholder> { private static final int item = 0; private static final int loading = 1; private static final string base_url_img = "http://www.example.com/api/service/img"; private list<lastmedicresult> medicresults; private context context; private boolean isloadingadded = false; public medicpaginationadapter(context context) { this.context = context; medicresults = new arraylist<>(); } public list<lastmedicresult> getmedics() { return medicresults; } public void setmedics(list<lastmedicresult> medicresults) { this.medicresults = medicresults; } @override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { recyclerview.viewholder viewholder = null; layoutinflater inflater = layoutinflater.from(parent.getcontext()); switch (viewtype) { case item: viewholder = getviewholder(parent, inflater); break; case loading: view v2 = inflater.inflate(r.layout.item_progress, parent, false); viewholder = new loadingvh(v2); break; } return viewholder; } @nonnull private recyclerview.viewholder getviewholder(viewgroup parent, layoutinflater inflater) { recyclerview.viewholder viewholder; view v1 = inflater.inflate(r.layout.service_list, parent, false); viewholder = new medicvh(v1); return viewholder; } @override public void onbindviewholder(recyclerview.viewholder holder, int position) { lastmedicresult result = medicresults.get(position); // movie switch (getitemviewtype(position)) { case item: final medicvh medicvh = (medicvh) holder; medicvh.mmovietitle.settext(result.gettitle()); medicvh.slocation.settext(result.getservicelocation()); medicvh.stype.settext(result.getservicetype()); medicvh.mmoviedesc.settext(result.getoverview()); glide .with(context) .load(base_url_img + result.getposterpath()) .listener(new requestlistener<string, glidedrawable>() { @override public boolean onexception(exception e, string model, target<glidedrawable> target, boolean isfirstresource) { // todo: 08/11/16 handle failure medicvh.mprogress.setvisibility(view.gone); return false; } @override public boolean onresourceready(glidedrawable resource, string model, target<glidedrawable> target, boolean isfrommemorycache, boolean isfirstresource) { // image ready, hide progress medicvh.mprogress.setvisibility(view.gone); return false; // return false if want glide handle else. } }) .diskcachestrategy(diskcachestrategy.all) // cache both original & resized image .centercrop() .crossfade() .into(medicvh.mposterimg); break; case loading: // nothing break; } } @override public int getitemcount() { return medicresults == null ? 0 : medicresults.size(); } @override public int getitemviewtype(int position) { return (position == medicresults.size() - 1 && isloadingadded) ? loading : item; } /* helpers */ public void add(lastmedicresult r) { medicresults.add(r); notifyiteminserted(medicresults.size() - 1); } public void addall(list<lastmedicresult> moveresults) { (lastmedicresult result : moveresults) { add(result); } } public void remove(lastmedicresult r) { int position = medicresults.indexof(r); if (position > -1) { medicresults.remove(position); notifyitemremoved(position); } } public void clear() { isloadingadded = false; while (getitemcount() > 0) { remove(getitem(0)); } } public boolean isempty() { return getitemcount() == 0; } public void addloadingfooter() { isloadingadded = true; add(new lastmedicresult()); } public void removeloadingfooter() { isloadingadded = false; int position = medicresults.size() - 1; lastmedicresult result = getitem(position); if (result != null) { medicresults.remove(position); notifyitemremoved(position); } } public lastmedicresult getitem(int position) { return medicresults.get(position); } protected class medicvh extends recyclerview.viewholder { private textview mmovietitle; private textview mmoviedesc; private textview slocation; private textview stype; private imageview mposterimg; private progressbar mprogress; public medicvh(view itemview) { super(itemview); mmovietitle = (textview) itemview.findviewbyid(r.id.movie_title); mmoviedesc = (textview) itemview.findviewbyid(r.id.movie_desc); slocation = (textview) itemview.findviewbyid(r.id.service_location); stype = (textview) itemview.findviewbyid(r.id.service_type); mposterimg = (imageview) itemview.findviewbyid(r.id.movie_poster); mprogress = (progressbar) itemview.findviewbyid(r.id.movie_progress); } } protected class loadingvh extends recyclerview.viewholder { public loadingvh(view itemview) { super(itemview); } } } please check steps change:
1- original code:
private static final int item = 0; // search private static final int loading = 1;// progress bar changed code:
private static final int item = 0; // search private static final int menu = 1; // search1 private static final int loading = 2;// progress bar 2-
public medicpaginationadapter(context context) { this.context = context; medicresults = new arraylist<>(); } to
public medicpaginationadapter(context context) { this.context = context; medicresults = new arraylist<>(); medicmenus = new arraylist<>(); } step 3:
public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { recyclerview.viewholder viewholder = null; layoutinflater inflater = layoutinflater.from(parent.getcontext()); switch (viewtype) { case item: viewholder = getviewholder(parent, inflater); break; case loading: view v2 = inflater.inflate(r.layout.item_progress, parent, false); viewholder = new loadingvh(v2); break; } return viewholder; } to
@override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) { recyclerview.viewholder viewholder = null; layoutinflater inflater = layoutinflater.from(parent.getcontext()); switch (viewtype) { case item: viewholder = getviewholder(parent, inflater,viewtype); break; case menu: viewholder = getviewholder(parent, inflater,viewtype); break; case loading: view v2 = inflater.inflate(r.layout.item_progress, parent, false); viewholder = new loadingvh(v2); break; } return viewholder; } step 4:
private recyclerview.viewholder getviewholder(viewgroup parent, layoutinflater inflater) { recyclerview.viewholder viewholder; view v1 = inflater.inflate(r.layout.service_list, parent, false); viewholder = new medicvh(v1); return viewholder; } to
private recyclerview.viewholder getviewholder(viewgroup parent, layoutinflater inflater, int viewtype) { recyclerview.viewholder viewholder; view v1; if(item == viewtype) { v1 = inflater.inflate(r.layout.service_list, parent, false); viewholder = new medicvh(v1); } else { v1 = inflater.inflate(r.layout.service_munu_list, parent, false); viewholder = new medicmenuvh(v1); } return viewholder; } step 5:
public void onbindviewholder(recyclerview.viewholder holder, int position) { lastmedicresult result = medicresults.get(position); switch (getitemviewtype(position)) { case item: final medicvh medicvh = (medicvh) holder; medicvh.mmovietitle.settext(result.gettitle()); ... break; case loading: //do nothing break; } } to
public void onbindviewholder(recyclerview.viewholder holder, int position) {
lastmedicresult result = medicresults.get(position); lastmedicresult menu = medicmenus.get(position); switch (getitemviewtype(position)) { case item: final medicvh medicvh = (medicvh) holder; medicvh.mmovietitle.settext(result.gettitle()); ... break; case menu: final medicmenuvh medicmenuvh = (medicmenuvh) holder; medicmenuvh .mmenutitle.settext(menu.gettitle()); ... break; case loading: //do nothing break; } } step6:
@override public int getitemviewtype(int position) { return (position == medicresults.size() - 1 && isloadingadded) ? loading : item; } to
public int getitemviewtype(int position) { //return (position == medicresults.size() - 1 && isloadingadded) ? item : item; if(medicresults.get(position) instanceof lastmedicresult) { return (position == medicresults.size() - 1 && isloadingadded) ? loading : item; } else if(medicmenus.get(position) instanceof lastmedicmenu) { return (position == medicmenus.size() - 1 && isloadingadded) ? loading : menu; } else { return loading; } } step 7: , add class:
protected class medicmenuvh extends recyclerview.viewholder { private textview mmenutitle; public medicmenuvh(view itemview) { super(itemview); mmenutitle = (textview) itemview.findviewbyid(r.id.menu_title); } } after change, shows result array in recyclerview.
what wrong in codes? can please tell me should else?
edit
accrording answers changed step 5 this:
@override public void onbindviewholder(recyclerview.viewholder holder, int position) { lastmedicresult result = medicresults.get(position); // result lastmedicmenu menu = medicmenus.get(position); switch (getitemviewtype(position)) { case item: final medicvh medicvh = (medicvh) holder; medicvh.mmovietitle.settext(result.gettitle()); break; case menu: { final medicmenuvh medicmenuvh = (medicmenuvh) holder; medicmenuvh.mmenutitle.settext(menu.gettitle()); break; } case loading: // nothing break; } } but error (the app crash) in error log line:
lastmedicmenu menu = medicmenus.get(position); i created model class menu before.
why error?
04-08 14:34:55.954 15584-15584/com.example.teb e/androidruntime: fatal exception: main java.lang.indexoutofboundsexception: invalid index 0, size 0 @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:251) @ java.util.arraylist.get(arraylist.java:304) @ com.example.teb.medicpaginationadapter.onbindviewholder(medicpaginationadapter.java:105)
if have model class menus, in onbindviewholder() set view bind menus before results in layout have..
lastmedicresult result = medicresults.get(position); lastmedicmenus menus = medicmenus.get(position); //custom name switch (getitemviewtype(position)) { case item: final medicvh medicvh = (medicvh) holder; medicvh.mmovietitle.settext(result.gettitle()); medicvh.mmoviename.settext(menus.getfoo()); //this way ... break; ... } }
Comments
Post a Comment