【问题标题】:Implementing Filter/Search functionality in ListAdapter returns UnsupportedOperationException在 ListAdapter 中实现过滤器/搜索功能返回 UnsupportedOperationException
【发布时间】:2020-08-01 23:46:18
【问题描述】:

我正在尝试在扩展 ListAdapter 的适配器类中实现搜索功能。我没有使用RecyclerAdapter,而是使用ListAdapter。在搜索字段的主要活动中,我使用EditTextaddTextChangedListener。我有这个例外:

这是我的代码:

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());
    }
});

【问题讨论】:

  • getCurrentList()有问题,请分享这个方法
  • 这是你在Adapter类中扩展ListAdapter的方法,例如:public class NoteAdapter extends ListAdapter&lt;Note, NoteAdapter.NoteHolder&gt; implements Filterable {

标签: java android adapter listadapter


【解决方案1】:

由于在UnmodifiableCollection 上使用.clear(),您将获得UnsupportedOperationException

查看您的代码以查看您在哪里使用clear()

getCurrentList().clear();

所以,getCurrentList() 肯定是UnmodifiableCollection,所以你不能像普通列表那样修改它。

getCurrentList()The documentation 说:

返回的列表可能不会被改变 - 内容的改变必须通过 submitList(List) 来完成。

因此,您可以将 ListAdapter getCurrentList() 更改为 submitList

所以,尝试将getCurrentList().clear() 替换为submitList(new ArrayList())

【讨论】:

  • 你说得对,我没有注意到在文档中,我用现在可以正常工作的代码更新了我的问题。谢谢。
猜你喜欢
  • 2012-08-12
  • 2022-11-27
  • 2015-06-15
  • 1970-01-01
  • 2019-05-10
  • 2012-05-05
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多