android - notifyDataSetChanged not working -


my app uses multicolumnlistview (https://github.com/huewu/pinterestlikeadapterview) , name says helps creating multi column list views.

the library great, specify, filtering not supported.

so trying create own text-filter functionality simple edit text.

finally achieve filter list need refresh listview , recall setadapter because pass list on it.

myadapter adapter = new myadapter(this,mylist); listview.setadapter(adapter); 

when execute listview.invalidateviews() or adapter.notifydatasetchanged() listview refreshed old list.

which best way of recalling setadapter? or maybe way of doing this..

thanks in advance

edit:

//method filters list log.i("on filter mylist.size()",""+mylist.size());       adapter.notifydatasetchanged();  //on adapter log.i("on adapter mylist.size()",""+mylist.size()); 

log:

enter image description here

adapter class:

public class miadaptadorlistacomercios extends baseadapter{  //textview , imageviews declarations  private context contexto;  private list<comercio> mylist;  public miadaptadorlistacomercios(context c,list<comercio> mylist){     this.contexto = c;     this.mylist = new arraylist<comercio>();     this.mylist = mylist; } @override public int getcount() {     log.i("on adapter mylist.size()",""+listacomercios.size());     return mylist.size(); }  @override public object getitem(int position) {     return mylist.get(position); }  @override public long getitemid(int arg0) {     // todo auto-generated method stub     return 0; }  @override public view getview(int position, view convertview, viewgroup parent)  {     view view =null;      if(convertview == null)     {         layoutinflater inflater = (layoutinflater) contexto.getsystemservice(context.layout_inflater_service);         view = inflater.inflate(r.layout.list_cell, null);     }     else{         view = convertview;     }      //set views texteviews text,font etc...      return view; } 

}

activity class:

public class listacomercio extends activity {      private multicolumnlistview madapterview = null;     edittext searchbar;     private arraylist<comercio> mylist;     private arraylist<comercio> filteredlist;     myadapter adapter;       public listacomercio(){         mylist = new arraylist<comercio>();         filteredlist = new arraylist<comercio>();            }      @override     protected void oncreate(bundle savedinstancestate) {          super.oncreate(savedinstancestate);         requestwindowfeature(window.feature_no_title);         setcontentview(r.layout.lista_comercios);          madapterview = (multicolumnlistview) findviewbyid(r.id.list);          adapter = new myadapter(listacomercio.this,mylist);          madapterview.setadapter(adapter);           searchbar.setoneditoractionlistener(new textview.oneditoractionlistener() {             @override             public boolean oneditoraction(textview v, int actionid, keyevent event) {                 if (actionid == editorinfo.ime_action_search) {                     charsequence filer =  v.gettext();                      for(comercio co : mylist)                     {                         if(co.getname().contains(filer))                         {                             filteredlist.add(co);                         }                     }                      mylist = filteredlist;                      log.i("on filter mylist.size()",""+mylist.size());                        mylist.clear();                     adapter.notifydatasetchanged();                     //madapterview.invalidateviews();                      return true;                 }                 return false;             }         });     }     } 

just change mylist , call adapter.notifydatasetchanged() don't set new adapter each time.

in constructor of custom adapter call super takes arraylist argument.

call this:

public miadaptadorlistacomercios(context c,list<comercio> mylist){     super(c,0,mylist);     this.contexto = c;     this.mylist = mylist; } 

you can keep adapter problem in line:

mylist = filteredlist; 

instead of changing reference should change list itself.

mylist.clear(); mylist.addall(filteredlist); 

by doing loose original list suggest keeping list call ed originallist have complete list , initialize mylist in oncreate by:

mylist=new arraylist(originallist); 

so every time want re-set call:

mylist.clear(); mylist.addall(originallist);     

and in

    for(comercio co : originallist)             {                 if(co.getname().contains(filer))                 {                     filteredlist.add(co);                 }             } 

Comments

Popular posts from this blog

python - Subclassed QStyledItemDelegate ignores Stylesheet -

java - HttpClient 3.1 Connection pooling vs HttpClient 4.3.2 -

SQL: Divide the sum of values in one table with the count of rows in another -