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

Popular posts from this blog

How to understand 2 main() functions after using uftrace to profile the C++ program? -

c# - Update a combobox from a presenter (MVP) -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -