android - Issue with the clear(); statement placement within ListViewAdpater -
so having problems duplicate items showing in listview when switching between fragments using drop down menu in action, placed clear(); statement fixed problem, crashes convertview.setonclicklistener below it. if remove clear(); statement works fine duplicate items in listview. using actionbarsherlock , code taken http://www.androidbegin.com/tutorial/implementing-actionbarsherlock-search-collapsible-view-in-android/ appriciated in trying figure out how can work together. if there other code need, let me know.
public class listviewadapter extends baseadapter { // declare variables context mcontext; layoutinflater inflater; private list<errorcode> errorcodelist = null; private arraylist<errorcode> arraylist; public listviewadapter(context context, list<errorcode> errorcodelist) { mcontext = context; this.errorcodelist = errorcodelist; inflater = layoutinflater.from(mcontext); this.arraylist = new arraylist<errorcode>(); this.arraylist.addall(errorcodelist); } public class viewholder { textview errorname; textview codevalue; textview description; textview solution; } @override public int getcount() { return errorcodelist.size(); } @override public errorcode getitem(int position) { return errorcodelist.get(position); } @override public long getitemid(int position) { return position; } public view getview(final int position, view convertview, viewgroup parent) { final viewholder holder; if (convertview == null) { holder = new viewholder(); convertview = inflater.inflate(r.layout.listview_item, null); // locate textviews in listview_item.xml holder.errorname = (textview) convertview.findviewbyid(r.id.errorname); holder.codevalue = (textview) convertview.findviewbyid(r.id.codevalue); holder.description = (textview) convertview.findviewbyid(r.id.description); holder.solution = (textview) convertview.findviewbyid(r.id.solution); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } // set results textviews holder.errorname.settext(errorcodelist.get(position).geterrorname()); holder.codevalue.settext(errorcodelist.get(position).getcodevalue()); holder.description.settext(errorcodelist.get(position).getdescription()); holder.solution.settext(errorcodelist.get(position).getsolution()); errorcodelist.clear(); // listen listview item click convertview.setonclicklistener(new onclicklistener() { public void onclick(view arg0) { // send single item click data singleitemview class intent intent = new intent(mcontext, singleitemview.class); // pass data errorname intent.putextra("errorname",(errorcodelist.get(position).geterrorname())); // pass data errorcode intent.putextra("codevalue",(errorcodelist.get(position).getcodevalue())); // pass data description intent.putextra("description",(errorcodelist.get(position).getdescription())); // pass data solution intent.putextra("solution",(errorcodelist.get(position).getsolution())); // start singleitemview class mcontext.startactivity(intent); } }); return convertview; } // filter class public void filter(string chartext) { chartext = chartext.tolowercase(locale.getdefault()); errorcodelist.clear(); if (chartext.length() == 0) { errorcodelist.addall(arraylist); } else { (errorcode ec : arraylist) { // search filter code if (ec.geterrorname().tolowercase(locale.getdefault()).contains(chartext)) { errorcodelist.add(ec); } if (ec.getcodevalue().tolowercase(locale.getdefault()).contains(chartext)) { errorcodelist.add(ec); } } } notifydatasetchanged(); } } here logcat when convertview.setonclicklistener crashes:
10-07 15:09:26.872: e/androidruntime(21500): fatal exception: main 10-07 15:09:26.872: e/androidruntime(21500): java.lang.indexoutofboundsexception: invalid index 0, size 0 10-07 15:09:26.872: e/androidruntime(21500): @ java.util.arraylist.throwindexoutofboundsexception(arraylist.java:251) 10-07 15:09:26.872: e/androidruntime(21500): @ java.util.arraylist.get(arraylist.java:304) 10-07 15:09:26.872: e/androidruntime(21500): @ com.testapplication.test2v5.listviewadapter$1.onclick(listviewadapter.java:93) 10-07 15:09:26.872: e/androidruntime(21500): @ android.view.view.performclick(view.java:4204) 10-07 15:09:26.872: e/androidruntime(21500): @ android.view.view$performclick.run(view.java:17355) 10-07 15:09:26.872: e/androidruntime(21500): @ android.os.handler.handlecallback(handler.java:725) 10-07 15:09:26.872: e/androidruntime(21500): @ android.os.handler.dispatchmessage(handler.java:92) 10-07 15:09:26.872: e/androidruntime(21500): @ android.os.looper.loop(looper.java:137) 10-07 15:09:26.872: e/androidruntime(21500): @ android.app.activitythread.main(activitythread.java:5041) 10-07 15:09:26.872: e/androidruntime(21500): @ java.lang.reflect.method.invokenative(native method) 10-07 15:09:26.872: e/androidruntime(21500): @ java.lang.reflect.method.invoke(method.java:511) 10-07 15:09:26.872: e/androidruntime(21500): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:793) 10-07 15:09:26.872: e/androidruntime(21500): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:560) 10-07 15:09:26.872: e/androidruntime(21500): @ dalvik.system.nativestart.main(native method)
you cannot alter list being iterated adapter inside own adapter methods, because changing positions. worst clear list. explains new error. so, remove clear() inside getview method.
the duplicated items comming filter, because can add 1 item twice if matches error , code. change to:
// search filter code if (ec.geterrorname().tolowercase(locale.getdefault()).contains(chartext)) { errorcodelist.add(ec); } else if (ec.getcodevalue().tolowercase(locale.getdefault()).contains(chartext)) { errorcodelist.add(ec); }
Comments
Post a Comment