android - How to search the data in listview by more than one thing? -


right now, app filters data in listview when somethings entered edittext, can filter 1 thing @ time. want able filter more value. example, if types in "chicken" should filter recipes word 'chicken'. but, if types in "dinner", want filter recipes both "chicken" , "dinner." eventually, want make values appear checkboxes above listview can removed.

i can't figure out how this. played around loops @ first didn't anywhere.

public class searchactivity extends navdraweractivity {       private dbhandler dbhelper;     private simplecursoradapter dataadapter;     arraylist<string> filters = new arraylist<string>();     //string[] filters;     framelayout framelayout;      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         //setcontentview(r.layout.activity_main_activity3);          framelayout = (framelayout) findviewbyid(r.id.activity_frame);         // inflate custom activity layout         layoutinflater layoutinflater = (layoutinflater) getsystemservice(context.layout_inflater_service);         view activityview = layoutinflater.inflate(r.layout.activity_main_activity3, null, false);         // add custom layout of activity frame layout.         framelayout.addview(activityview);          dbhelper = new dbhandler(this, null, null, 1);         //dbhelper.open();          //clean data         dbhelper.deleteallrecipes();         //add data         dbhelper.insertsomerecipes();          //generate listview sqlite database         displaylistview();      }      @override     public boolean oncreateoptionsmenu(menu menu) {         getmenuinflater().inflate(r.menu.menu_main, menu);         return true;     }      private void displaylistview() {          final cursor cursor = dbhelper.fetchallrecipes();          // desired columns bound         string[] columns = new string[]{                 //dbhandler.column_code,                 dbhandler.column_name,                 dbhandler.column_type,                 dbhandler.column_ingred         };          // xml defined views data bound         int[] = new int[]{                 //r.id.code,                 r.id.name,                 r.id.type,                 r.id.ingredient,         };          // create adapter using cursor pointing desired data         //as layout information         dataadapter = new simplecursoradapter(                 this, r.layout.recipeinfo,                 cursor,                 columns,                 to,                 0);           listview listview = (listview) findviewbyid(r.id.listview1);         // assign adapter listview         listview.setadapter(dataadapter);          listview.setonitemclicklistener(new adapterview.onitemclicklistener() {             @override             public void onitemclick(adapterview<?> listview, view view,                                     int position, long id) {                 // cursor, positioned corresponding row in result set                 cursor cursor = (cursor) listview.getitematposition(position);                 string recipename = cursor.getstring(cursor.getcolumnindexorthrow("name"));                 intent n = new intent(getapplicationcontext(), recipeactivity.class);                 //n.putextra("position", position);                 n.putextra("recipename", recipename);                 startactivity(n);             }         });          //final gridview gridview = (gridview)findviewbyid(r.id.gridview);         final textview tv = (textview)findviewbyid(r.id.textview14);         final edittext myfilter = (edittext) findviewbyid(r.id.myfilter);         myfilter.setimeactionlabel("filter",1);         myfilter.setprivateimeoptions("actionunspecified");         myfilter.setoneditoractionlistener(new textview.oneditoractionlistener() {             @override             public boolean oneditoraction(textview textview, int id, keyevent keyevent) {                 if (id == 1 || id == editorinfo.ime_null) {                     string filter = textview.gettext().tostring();                     dataadapter.getfilter().filter(filter);                     filters.add(filter);                     tv.append(filter);                     myfilter.settext("");                 }                 return false;             }         });          dataadapter.setfilterqueryprovider(new filterqueryprovider() {             public cursor runquery(charsequence constraint) {                 return dbhelper.fetchrecipesbyname(constraint.tostring());             }         });      }      public void onitemclick(adapterview<?> parent, view view, int position, long id) {         // start new activity via intent         intent intent = new intent();         intent.setclass(this, recipeactivity.class);         intent.putextra("position", position);         // or / ,         intent.putextra("id", id);         startactivity(intent);      } } 

fetchrecipesbyname in dbhandler

public cursor fetchrecipesbyname(string inputtext) throws sqlexception {     sqlitedatabase mdb = this.getwritabledatabase();     log.w(tag, inputtext);     cursor mcursor = null;     if (inputtext == null  ||  inputtext.length () == 0)  {         mcursor = mdb.query(sqlite_table, new string[] {column_rowid,                         column_name, column_type, column_ingred, column_imgpath},                 null, null, null, null, null);      }     else {          mcursor = mdb.query(true, sqlite_table, new string[] {column_rowid,                         column_name, column_type, column_ingred, column_imgpath},                 column_name + " '%" + inputtext + "%'" + " or " +                         column_type + " '%" + inputtext + "%'" + " or " +                         column_ingred + " '%" + inputtext + "%'",                 null, null, null, null, null);     }     if (mcursor != null) {         mcursor.movetofirst();     }     return mcursor;  } 

what implementation of dbhelper.fetchreccipesbyname()? think, of now, queries table 1 thing. should change logic , implement complex need in method (obviously, should sql query execution).

as best practice, should call listview.setfiltertext() instead of dataadapter.getfilter().filter(), because method supposed run in secondary thread reason db queries time consuming. if call listview.setfiltertext(), framework take care of threading , calls filter.filter() in secondary thread.

and finally, since searching more 1 keyword, setfiltertext() accepts 1 charsequence param, should encode somehow many keywords single string (say comma separated). , while querying decode constraint keywords.


Comments

Popular posts from this blog

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

python - Mongodb How to add addtional information when aggregating? -

java - Incorrect order of records in M-M relationship in hibernate -