使用loadermanager和内容提供者进行过滤

时间:2014-06-21 19:07:39

标签: android android-loadermanager

我的片段实现LoaderManager.LoaderCallBacks<Cursor>接口,以使用自定义游标适配器从内容提供程序加载列表视图。我使用SearchView小部件按照文档http://developer.android.com/guide/components/loaders.html#restarting的建议重新启动加载程序来过滤列表视图中的数据。

我对这种方法有两个问题:

  1. 当我使用restartLoader()时,只会调用onCreateLoader()onLoadFinished()。我没有在logcat中看到对onLoaderReset()的调用。这意味着在搜索过程中永远不会完成myadaptor.swapCursor(null)。老光标也泄露了吗?在每次致电myadaptor.swapCursor(null)之前,我是否需要restartLoader()

  2. 是否有更有效的方法来过滤数据?因为对于用户输入的每个字符重新启动整个加载器似乎太昂贵了。在http://androidxref.com/4.4.2_r2/xref/frameworks/base/core/java/android/app/LoaderManager.java#648restartLoader()的Android源代码执行了大量拆除加载程序资源并重新创建它的工作。如果我可以对数据进行简单的重新查询,那将会更有效率。

  3. 代码:

    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);
    }
    

0 个答案:

没有答案