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
Post a Comment