【发布时间】:2015-10-06 13:57:40
【问题描述】:
我使用带有自定义适配器和提供程序的 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 查询方法只被调用一次吗?不是每次都输入?
【问题讨论】:
-
它按预期工作...... initLoader
-
很抱歉,从文档中看得很清楚,这应该是行为。我最终使用 getActivity().getLoaderManager().restartLoader(1, data, this);
-
我最终使用 getActivity().getLoaderManager().restartLoader(1, data, this); :) ... initLoader 在你 fx 时很好:旋转屏幕并且您不想重新查询(注意:支持:23.0.1 f* 它)...如果您想重新查询,那么 restartLoader 就是这样... 所以,是的,“以 restartLoader 结尾”是一个很好的解决方案
标签: android android-contentprovider searchview search-suggestion