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