Я использую searchView с базой данных комнаты, чтобы отфильтровать результат recyclerView внутри фрагмента.
Когда я щелкаю по любому элементу recyclerView, он переходит к detailsFragment с использованием библиотеки компонентов Navigation.
Пока все работает нормально, проблема в том, что когда я нажимал кнопку «Назад» из detailsFragment в go обратно в BooksFragment, перезапуска ресивера исчезает.
Эта проблема появляется только тогда, когда я реализовал функцию searchView, прежде чем я смог перейти вперед и назад без проблем.
Что не так в моем коде и как его решить.
мой адаптер
public class BookAdapter extends RecyclerView.Adapter<BookAdapter.BookViewHolder> implements Filterable {
private final LayoutInflater mInflater;
private List<Book> mBookList;
private List<Book> mBookListFiltered;
private BookViewModel bookViewModel;
private Context context;
public BookAdapter(Context context, BookViewModel bookViewModel) {
this.context = context;
mInflater = LayoutInflater.from(context);
this.bookViewModel = bookViewModel;
}
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.item_main, parent, false);
return new BookViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull BookViewHolder holder, int position) {
if (mBookList != null) {
int listNumber = position + 1;
Book current = mBookList.get(position);
holder.title.setText(current.getBookTitle());
holder.number.setText(String.valueOf(listNumber));
// on item clicked
holder.itemView.setOnClickListener(view -> Navigation.findNavController(view).navigate(R.id.action_BookFragment_to_detailsFragment));
}
}
@Override
public int getItemCount() {
if (mBookList != null)
return mBookList.size();
else return 0;
}
public void setBooks(List<Book> bookList) {
mBookList = bookList;
mBookListFiltered = bookList;
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults filterResults = new FilterResults();
if (charSequence == null || charSequence.length() == 0) {
filterResults.count = mBookListFiltered.size();
filterResults.values = mBookListFiltered;
} else {
String searchChr = charSequence.toString().toLowerCase();
List<Book> resultData = new ArrayList<>();
for (Book book : mBookListFiltered) {
if (book.getBookTitle().toLowerCase().contains(searchChr)) {
resultData.add(book);
}
}
filterResults.count = resultData.size();
filterResults.values = resultData;
}
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mBookList = (List<Book>) filterResults.values;
notifyDataSetChanged();
}
};
}
class BookViewHolder extends RecyclerView.ViewHolder {
private final AppCompatTextView title, number;
private AppCompatImageView imgSave;
private BookViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.tv_title);
number = itemView.findViewById(R.id.tv__title_number);
}
}
}
Фрагмент книги
public class BookFragment extends Fragment {
private FragmentBookBinding mBinding;
private BookViewModel mBookViewModel;
private BookAdapter adapter;
public BookFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_book, container, false);
mBookViewModel = new ViewModelProvider(this).get(BookViewModel.class);
adapter = new BookAdapter(getContext(), mBookViewModel);
mBinding.recycler.setAdapter(adapter);
mBinding.recycler.setLayoutManager(new LinearLayoutManager(getContext()));
mBookViewModel.getAllBooks().observe(this, books -> adapter.setBooks(books));
// to make all searchView box clickable
mBinding.searchView.setOnClickListener(v -> mBinding.searchView.setIconified(false));
mBinding.searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
});
return mBinding.getRoot();
}
}