Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Поиск в ListView fragment из Activity

Есть Activity с TabLayout. В TabLayout Fragments со списком (ListView). В каждом списке заполнены списки данными. В Activity в шапке есть searchView.(поиск). При наборе список должен фильтроваться динамически. И так что сделано.
Реализовано все без Activity. Ниже код.
public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_song, menu);
MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setOnQueryTextListener(this);
return true; }
public boolean onQueryTextSubmit(String s) { return false; }
@Override public boolean onQueryTextChange(String s) { artistAdapter.getFilter().filter(s); return true; } Фильтр в адаптере написан. Список имеет данные и фильтруется.
Так вот, это реализовано в одном Activity Без Fragments, а как реализовать с фрагментами это чудо. Что бы в Activity в Searchview я вбивал, а во Fragment фильтровался список.
p.s. Чувствую, что решение связано с интерфейсами.


Ответ

Вместо того что бы инфлейтить меню в Activity лучше делать это непосредственно в Fragment-e. Даже если в Activity есть данные необходимые для поиска, что очень редко бывает, то из фрагмента несложно их получить.
А вот поисковую логику для фрагмента лучше реализовать в нём самом. Для этого нужно сделать следующие вещи:
сказать фрагменту, чтобы он отображал меню
@Override public void onResume() { super.onResume(); setHasOptionsMenu(true);//для этого преднозначен этот метод //Ваш код }
Реализовать методы для создания меню
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Inflate the menu; this adds items to the action bar if it is present. inflater.inflate(R.menu.menu_song, menu);
MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setOnQueryTextListener(this); }
public boolean onQueryTextSubmit(String s) { return false; }
@Override public boolean onQueryTextChange(String s) { artistAdapter.getFilter().filter(s); return true; }
Обратите внимание метод onCreateOptionsMenu различается сигнатурой с анологичным методом из Activity.
Осталось только во фрагменте реализовать необходимые листенеры.

Комментариев нет:

Отправить комментарий