android - Searching in a ListFragment using LoaderEX -
i'm having major block trying search data in lists generated using cursors prepopulated sqlite db.
i'm using following libs:
- actionbarsherlock.
- sqlite asset helper (to ease loading of data db).
- loaderex.
when start app, list empty , when type letters on searchview, nothing displayed. query used works because before trying implement library data displayed.
import android.database.cursor; import android.os.bundle; import android.support.v4.app.loadermanager; import android.support.v4.content.loader; import android.text.textutils; import android.view.view; import android.widget.listview; import android.widget.toast; import com.actionbarsherlock.app.sherlocklistfragment; import com.actionbarsherlock.view.menu; import com.actionbarsherlock.view.menuinflater; import com.actionbarsherlock.widget.searchview; import com.actionbarsherlock.widget.searchview.onquerytextlistener; import com.commonsware.cwac.loaderex.acl.sqlitecursorloader; import es.nirvash.android.mvptimer.adapters.moblistadapter; import es.nirvash.android.mvptimer.database.databasemanager; public class fragmvp extends sherlocklistfragment implements loadermanager.loadercallbacks<cursor> { private databasemanager database; private moblistadapter madapter; private sqlitecursorloader mloader; private string currentquery = null; private final static int mvp_id = 1100; @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); sethasoptionsmenu(true); database = new databasemanager(getsherlockactivity()); cursor cursor = database.moblist("2"); if (cursor != null) { madapter = new moblistadapter(getactivity(), cursor, false); setlistadapter(madapter); } getloadermanager().initloader(mvp_id, null, fragmvp.this); } @override public void oncreateoptionsmenu(menu menu, menuinflater inflater) { inflater.inflate(r.menu.menu, menu); searchview searchview = (searchview) menu.finditem(r.id.menu_search).getactionview(); searchview.setonquerytextlistener(querylistener); } final private onquerytextlistener querylistener = new onquerytextlistener() { @override public boolean onquerytextchange(string newtext) { if (textutils.isempty(newtext)) { currentquery = ""; toast.maketext(getactivity(), "searching for: " + currentquery + "...", toast.length_short).show(); } else { currentquery = newtext; toast.maketext(getactivity(), "searching for: " + currentquery + "...", toast.length_short).show(); } return false; } @override public boolean onquerytextsubmit(string query) { currentquery = query; return false; } }; @override public loader<cursor> oncreateloader(int id, bundle bargs) { string query = "select mo._id, mo.sprite, mo.iname, mo.lvl, mo.hp, ra.race, pr.property, mo.counter " + "from mobs mo " + "join race ra on (ra._id = mo.race) " + "join property pr on (pr._id = mo.property) " + "where mo.mobtype = ? " + "and mo.iname ? " + "order mo.iname " + "asc;"; string = "%" + currentquery + "%"; string[] args = { "2", }; mloader = new sqlitecursorloader(getactivity(), database, query, args); return (mloader); } @override public void onloadfinished(loader<cursor> loader, cursor cursor) { madapter.changecursor(cursor); if (isresumed()) { setlistshown(true); } else { setlistshownnoanimation(true); } } @override public void onloaderreset(loader<cursor> loader) { madapter.changecursor(null); } } what doing wrong? thank in advance.
thanks commonsware, figured out putting initloader() method inside onactivitycreated wrong because called once.
instead, should put restartloader() method inside funcion called everytime searchview gets updated, onquerytextchange.
final private onquerytextlistener querylistener = new onquerytextlistener() { @override public boolean onquerytextchange(string newtext) { if (textutils.isempty(newtext)) { currentquery = ""; toast.maketext(getactivity(), "searching for: " + currentquery + "...", toast.length_short).show(); } else { currentquery = newtext; toast.maketext(getactivity(), "searching for: " + currentquery + "...", toast.length_short).show(); } **getloadermanager().restartloader(mvp_id, null, fragmvp.this);** return false; } @override public boolean onquerytextsubmit(string query) { currentquery = query; return false; } };
Comments
Post a Comment