Проблемы с предложением пользовательского поиска в SearchView

У меня есть пользовательский поиск, реализованный с использованием SearchView (ActionBar) с настраиваемым адаптером и провайдером. У меня проблема в том, что метод query() ContentProvider вызывается только один раз, когда я впервые ввожу что-то в SearchView! Если я продолжаю печатать в представлении, запрос не вызывается, поэтому список предложений не обновляется.

Во фрагменте у меня есть инициализация SearchView:

@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 только переопределяет макет предлагаемых элементов.

Фрагмент реализует QueryTextListener, а метод onQueryTextChange выглядит так:

@Override
public boolean onQueryTextChange(String newText) {
    Bundle data = new Bundle();
    data.putString("query", newText);
    getActivity().getLoaderManager().initLoader(1, data, this);
    return true;
}

Фрагмент также реализует 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 вызывается только один раз? Не каждый раз, когда я печатаю?


person cmg_george    schedule 06.10.2015    source источник
comment
работает как задумано... initLoader ‹= это ключ... читать документацию   -  person Selvin    schedule 06.10.2015
comment
Извините, из документации было так ясно, что это должно быть поведение. В итоге я использую getActivity().getLoaderManager().restartLoader(1, data, this);   -  person cmg_george    schedule 06.10.2015
comment
В итоге я использую getActivity().getLoaderManager().restartLoader(1, data, this); :) ... initLoader хорош, когда вы fx: поворачиваете экран, и вы не хотите запрашивать (обратите внимание: support:23.0.1 f* it up) ... если вы хотите запросить requery, тогда перезапускLoader подойдет... так что, да, окончание на restartLoader - хорошее решение   -  person Selvin    schedule 06.10.2015


Ответы (1)


Как предположил Селвин, проблема заключалась в методе initLoader().

Правильная строка:

getActivity().getLoaderManager().restartLoader(1, data, this);
person cmg_george    schedule 13.10.2015