java - Items repeating when scrolling in ListView -


i using custom adapter in listview. when print out data in arraylist, stored correctly, though when scroll items repeat. know getview method kind of jumbled , confusing, though why not representing arraylist data, "oslist," correctly?

here adapter code:

public class wxycadapter extends baseadapter {  private fragmentactivity context; private arraylist<hashmap<string, string>> oslist; private arraylist<hashmap<string, string>> heartlist;  private layoutinflater minflater;  private final static int stream_layout = 0; private final static int talkset_layout = 1; private final static int breakpoint_layout = 2; private final static int playcut_layout = 3; private final static int null_layout = 4;  string url; viewholder holder;  public wxycadapter(fragmentactivity context, arraylist<hashmap<string, string>> oslist) {     this.context = context;     this.oslist = oslist;     this.minflater = (layoutinflater) context             .getsystemservice(context.layout_inflater_service);  }   @override public int getcount() {     return this.oslist.size(); }  @override public object getitem(int position) {     return null; }  @override public long getitemid(int position) {     return position; }  @override public int getitemviewtype(int position) {      int return_layout = null_layout;      switch (oslist.get(position).get("layouttype")) {         case "livestream":             return_layout = stream_layout;             break;          case "playcut":             return_layout = playcut_layout;             break;          case "talkset":             return_layout = talkset_layout;             break;          case "breakpoint":             return_layout = breakpoint_layout;             break;     }      return return_layout;  }  @override public int getviewtypecount() {     return 4; }  @override public view getview(int position, view convertview, viewgroup parent) {      holder = null;     int type = getitemviewtype(position);      if (convertview == null) {         holder = new viewholder();         switch (type) {             case stream_layout:                 convertview = minflater.inflate(r.layout.listview_cell, null);                  holder.cell_image = (imageview) convertview.findviewbyid(r.id.cell_image);                 holder.cell_image.setimageresource(r.drawable.boombox);                  holder.song = (textview) convertview.findviewbyid(r.id.song);                 holder.artist = (textview) convertview.findviewbyid(r.id.artist);                  holder.song.setenabled(false);                 holder.song.setmaxheight(0);                  holder.artist.setenabled(false);                 holder.artist.setmaxheight(0);                  convertview.settag(holder);                 break;              case talkset_layout:                 convertview = minflater.inflate(r.layout.listview_cell, null);                  holder.cell_image = (imageview) convertview.findviewbyid(r.id.cell_image);                 holder.cell_image.setimagebitmap(null);                 holder.cell_image.setenabled(false);                 holder.cell_image.setmaxheight(0);                 holder.cell_image.setmaxwidth(0);                  holder.song = (textview) convertview.findviewbyid(r.id.song);                 holder.artist = (textview) convertview.findviewbyid(r.id.artist);                 holder.song.settext("talkset");                 holder.artist.settext(null);                  holder.artist.setenabled(false);                 holder.artist.setmaxheight(0);                  convertview.settag(holder);                 break;              case breakpoint_layout:                 convertview = minflater.inflate(r.layout.listview_cell, null);                  holder.cell_image = (imageview) convertview.findviewbyid(r.id.cell_image);                 holder.cell_image.setimagebitmap(null);                 holder.cell_image.setenabled(false);                 holder.cell_image.setmaxheight(0);                 holder.cell_image.setmaxwidth(0);                  holder.song = (textview) convertview.findviewbyid(r.id.song);                  //holder.song.settypeface(typeface.createfromasset(context.getassets(), "default.ttf"));                  holder.artist = (textview) convertview.findviewbyid(r.id.artist);                 holder.song.settext("breakpoint");                 holder.artist.settext(null);                 holder.artist.setenabled(false);                 holder.artist.setmaxheight(0);                   long l = long.parselong(oslist.get(position).get("hour"));                  calendar calendar = calendar.getinstance();                 calendar.settimeinmillis(l);                 calendar.settimeinmillis(l * 1000);                  int hour = calendar.get(calendar.hour);                  convertview.settag(holder);                 break;              case playcut_layout: //playcut                   convertview = minflater.inflate(r.layout.listview_cell, null);                   //holder.cell_image = (imageview) convertview.findviewbyid(r.id.cell_image);                  //holder.cell_image.setimageresource(r.drawable.no_album_art);                  holder.song = (textview) convertview.findviewbyid(r.id.song);                 holder.artist = (textview) convertview.findviewbyid(r.id.artist);                  holder.song.settext(oslist.get(position).get("songtitle"));                 holder.artist.settext(oslist.get(position).get("artistname"));                  convertview.settag(holder);                 break;             case null_layout:                 convertview.settag(holder);                 break;          }       } else {         holder = (viewholder) convertview.gettag();     }      return convertview;  }  @override public boolean hasstableids(){     return true; }    public static class viewholder {     public textview textview, song, artist;       public imageview cell_image;     public button playbutton; } 

}

listview should reuse view. so, same view can used in other items of list.

the main problem changing view's content if view null

wrong way

if(convertview == null) {     //inflate view     // change view content } 

since view can reused, not null.

as said, issue fixed after moved switch statement outside of null condition.

this way, view content changed according current item (which correct)

right way

if(convertview == null) {     // inflate } // change view content 

this caused confusion me @ beginning... view reused.. should change content accordingly.


Comments

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Magento/PHP - Get phones on all members in a customer group -

session - Logging Out Using PHP -