searchView с базой данных номеров - PullRequest
0 голосов
/ 14 марта 2020

Я использую 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();
}
}

1 Ответ

0 голосов
/ 15 марта 2020

используйте

mBookList.addAll((List<Book>) filterResults.values);

вместо

mBookList = (List<Book>) filterResults.values;

, если проблема все еще существует, вы должны прочитать о клонировании ArrayList, метод ArrayList clone () используется для создания поверхностной копии из списка. В новом списке копируются только ссылки на объекты. Если мы изменим состояние объекта внутри первого массива, то измененное состояние объекта будет отражено и в клонированном массиве.

...