我有一个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的游标的相关性感到困惑。
任何解释都会很棒