Как реализовать функцию фильтра / поиска в ListAdapter - РАБОТАЕТ - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь реализовать функцию поиска в своем классе адаптера, который расширяет ListAdapter. Я не использую RecyclerAdapter, но вместо этого использую ListAdapter . В основном для поля поиска я использую EditText и addTextChangedListener. У меня это исключение:

исключение

Это мой код:

public class NoteAdapter extends ListAdapter<Note, NoteAdapter.NoteHolder> implements Filterable {
    private List<Note> mNoteListInit;
    private OnItemClickListener mListener;

    public NoteAdapter() {
        super(DIFF_CALLBACK);
        exampleListFull = new ArrayList<>(getCurrentList());
    } 

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }
    
    public void setInitList(List<Note> noteList) {
        mNoteListInit = new ArrayList<>(noteList);
    }


    private Filter exampleFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Note> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(mNoteListInit);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();

                for (Note note : mNoteListInit) {
                    if (note.getTitle().toLowerCase().contains(filterPattern)) {
                        filteredList.add(note);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            submitList((List) results.values);
        }
    };

В MainActivity:

mEditTextToolbarSearch.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { }

    @Override
    public void afterTextChanged(Editable s) {
        noteAdapter.getFilter().filter(s.toString());
    }
});

mNoteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() {
    @Override
    public void onChanged(List<Note> notes) {
        noteAdapter.submitList(notes);
        noteAdapter.setInitList(noteAdapter.getCurrentList());
    }
});

1 Ответ

1 голос
/ 02 августа 2020

Вы получаете UnsupportedOperationException Из-за использования .clear() на UnmodifiableCollection

Загляните в свой код, чтобы узнать, где вы используете clear():

getCurrentList().clear();

Итак, определенно getCurrentList() это UnmodifiableCollection, поэтому вы не можете изменять его, как обычные списки.

В документации из getCurrentList() говорится:

Возвращенный список не может быть изменен - ​​изменения содержимого должны выполняться с помощью submitList (List).

Таким образом, вы можете изменить ListAdapter getCurrentList() через submitList

Итак, попробуйте заменить getCurrentList().clear() на submitList(new ArrayList())

...