Есть 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.
Осталось только во фрагменте реализовать необходимые листенеры.
Комментариев нет:
Отправить комментарий