【问题标题】:Problems with custom search suggestion on a SearchViewSearchView 上的自定义搜索建议问题
【发布时间】: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


【解决方案1】:

正如 Selvin 所说,问题出在 initLoader() 方法上。

正确的行是:

getActivity().getLoaderManager().restartLoader(1, data, this);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多