我使用SearchView(ActionBar)和自定义适配器和提供程序实现了自定义搜索。 我遇到的问题是ContentProvider的query()方法只调用一次,第一次在SearchView中输入内容!如果我继续在视图中键入,则不会调用查询,因此建议列表不会更新。
在一个片段中我有SearchView init:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.planning, menu);
SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.searchAirportItem).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
searchView.setOnQueryTextListener(this);
searchView.setOnSuggestionListener(this);
airportSearchAdapter = new AirportSearchAdapter(getActivity());
searchView.setSuggestionsAdapter(airportSearchAdapter);
}
建议适配器AirportSearchAdapter仅重新定义建议项目的布局。
Fragment实现QueryTextListener,onQueryTextChange方法看起来像
@Override
public boolean onQueryTextChange(String newText) {
Bundle data = new Bundle();
data.putString("query", newText);
getActivity().getLoaderManager().initLoader(1, data, this);
return true;
}
Fragment还实现了LoaderCallbacks:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = AirportsContentProvider.CONTENT_URI;
return new CursorLoader(getActivity(), uri, null, null, new String[] { args.getString("query") }, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
airportSearchAdapter.changeCursor(data);
}`
任何想法为什么ContentProvider查询方法只被调用一次?不是每次我输入?
答案 0 :(得分:0)
正如Selvin所说,问题是initLoader()方法。
正确的行是:
getActivity().getLoaderManager().restartLoader(1, data, this);