过滤CursorAdapter的正确方法是什么?

时间:2016-03-29 15:47:47

标签: android android-cursoradapter

我有一个Android应用程序,有一个相当大的搜索建议数据库,我试图在SearchView中使用。当用户在搜索视图中输入文本时,我想使用他们的查询过滤我的搜索建议。

这是我的原始设置

protected void initToolbar(View rootView, String title) {
    searchView = (SearchView) toolbar.findViewById(R.id.res_search_view);
    searchView.setOnQueryTextListener(this);
    searchView.setOnSuggestionListener(this);
    Cursor newCursor = SearchUtil.getSearchSuggestionsCursor(title);
    SearchCursorAdapter adapter = new SearchCursorAdapter(rootView.getContext(),newCursor);
    searchView.setSuggestionsAdapter(adapter);
}   

@Override
public boolean onQueryTextChange(String query) {
    if (query == null || query.length() < 2){
        return false;
    }

    SearchCursorAdapter adapter = (SearchCursorAdapter) searchView.getSuggestionsAdapter();
    if (adapter != null){
        Cursor newCursor = SearchUtil.getSearchSuggestionsCursor(query);
        adapter.changeCursor(newCursor);
    }
    return false;
}

使用这种逻辑,应用程序有时会因“尝试重新打开已关闭的对象”而崩溃,而且一般来说,如果用户快速输入,UI会感觉有点迟钝。

这是我的新设置:

 protected void initToolbar(View rootView, String title) {
     searchView = (SearchView) toolbar.findViewById(R.id.res_search_view);
     searchView.setOnQueryTextListener(this);
     searchView.setOnSuggestionListener(this);
     Cursor newCursor = SearchUtil.getSearchSuggestionsCursor(title);
     SearchCursorAdapter adapter = new SearchCursorAdapter(rootView.getContext(),newCursor);

     adapter.setFilterQueryProvider(new FilterQueryProvider() {
         @Override
         public Cursor runQuery(CharSequence charSequence) {
             if (charSequence != null){
                 return SearchUtil.getSearchSuggestionsCursor(charSequence.toString());
             } else {
                 return SearchUtil.getSearchSuggestionsCursor("");
             }
        }
    });
 }



 @Override
 public boolean onQueryTextChange(String query) {
     searchView.getSuggestionsAdapter().getFilter().filter(query);
     return false;
 }

使用FilterQueryProvider,我的所有问题似乎都消失了。我的问题是我应该一直使用FilterQueryProvider。

另外,我对FilterQueryProvider中返回的游标与我最初提供给CursorAdapter的游标的相关性感到困惑。

任何解释都会很棒

0 个答案:

没有答案