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

Popular posts from this blog

c++ - CryptStringToBinary API behavior -

c++ - Correct method for redrawing a layered window -

java.util.scanner - How to read and add only numbers to array from a text file -