我的片段实现LoaderManager.LoaderCallBacks<Cursor>
接口,以使用自定义游标适配器从内容提供程序加载列表视图。我使用SearchView小部件按照文档http://developer.android.com/guide/components/loaders.html#restarting的建议重新启动加载程序来过滤列表视图中的数据。
我对这种方法有两个问题:
当我使用restartLoader()
时,只会调用onCreateLoader()
和onLoadFinished()
。我没有在logcat中看到对onLoaderReset()
的调用。这意味着在搜索过程中永远不会完成myadaptor.swapCursor(null)
。老光标也泄露了吗?在每次致电myadaptor.swapCursor(null)
之前,我是否需要restartLoader()
?
是否有更有效的方法来过滤数据?因为对于用户输入的每个字符重新启动整个加载器似乎太昂贵了。在http://androidxref.com/4.4.2_r2/xref/frameworks/base/core/java/android/app/LoaderManager.java#648的restartLoader()
的Android源代码执行了大量拆除加载程序资源并重新创建它的工作。如果我可以对数据进行简单的重新查询,那将会更有效率。
代码:
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String query) {
Bundle queryBundle = new Bundle();
queryBundle.putString("SearchQuery", query);
getLoaderManager().restartLoader(0, queryBundle, myFragment.this);
return true;
}
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle queryBundle) {
String selection = null;
String[] selectionArgs = null;
if(queryBundle != null){
selection = myTable.COLUMN_ABC + " like ?";
selectionArgs = new String[] {"%" + queryBundle.getString("SearchQuery") + "%"};
}
CursorLoader cursorLoader = new CursorLoader(getActivity(), uri, projection, selection, selectionArgs, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
myadaptor.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
myadaptor.swapCursor(null);
}