首页 > 解决方案 > RecyclerView 中的搜索过滤器不显示任何内容

问题描述

我的应用程序包括让您添加可以保存笔记的列表。因此,我有这个 NotesListActivity,我可以在其中添加和保留我的列表。我想按照https://www.youtube.com/watch?v=CTvzoVtKoJ8教程过滤此列表,然后尝试将其调整为如下所示的代码。你能告诉我这里有什么问题吗,因为我什至没有收到错误,我只是没有得到任何列表标题。所以,这就是我的 RecyclerAdapter 中的内容:

public class NotesRecyclerAdapter extends RecyclerView.Adapter<NotesRecyclerAdapter.ViewHolder> implements Filterable {

    private static final String TAG = "NotesRecyclerAdapter";
    ArrayList<Note> notesListAll;

    private ArrayList<Note> mNotes;
    private OnNoteListener mOnNoteListener;

    public NotesRecyclerAdapter(ArrayList<Note> mNotes, OnNoteListener onNoteListener) {
        this.mNotes = mNotes;
        this.mOnNoteListener = onNoteListener;
        this.notesListAll = new ArrayList<>();
        notesListAll.addAll(mNotes);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       ...
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
       ...
    }

    @Override
    public int getItemCount() {
        return mNotes.size(); 
    }

    @Override
    public Filter getFilter() { return myFilter; }

    Filter myFilter = new Filter() {

        //runs on background thread
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            List<Note> filteredList = new ArrayList<>();

            if (charSequence == null || charSequence.length() == 0) {

                filteredList.addAll(notesListAll);
            } else {

                for (Note note : notesListAll) {

                    if (note.getTitle().toLowerCase().contains(charSequence.toString().toLowerCase())) {
                        filteredList.add(note);

                    }
                }
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;

            return filterResults;
        }

        //runs on a ui thread
        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

            mNotes.clear();
            mNotes.addAll((Collection <? extends Note>) filterResults.values );

            notifyDataSetChanged();
        }
    };



    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

       ...
        }

        @Override
        public void onClick(View view) {
            ...
        }
    }

    public interface OnNoteListener{
        void onNoteClick(int position);
    }
}

这在我的活动中:

public class NotesListActivity extends AppCompatActivity implements
        NotesRecyclerAdapter.OnNoteListener,
        FloatingActionButton.OnClickListener
{

    private static final String TAG = "NotesListActivity";


    private RecyclerView mRecyclerView;


    private ArrayList<Note> mNotes = new ArrayList<>();
    private NotesRecyclerAdapter mNoteRecyclerAdapter;
    private NoteRepository mNoteRepository;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ...

        initRecyclerView();
        mNoteRepository = new NoteRepository(this);
        retrieveNotes();

        setSupportActionBar((Toolbar)findViewById(R.id.notes_toolbar));
        setTitle("Notes");
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.search,menu);
        MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) item.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

             //   NotesRecyclerAdapter.getFilter().filter(newText);
                mNoteRecyclerAdapter.getFilter().filter(newText);
                return false;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }

    private void retrieveNotes() {
        mNoteRepository.retrieveNotesTask().observe(this, new Observer<List<Note>>() {
            @Override
            public void onChanged(@Nullable List<Note> notes) {
               ...
            }
        });
    }


    private void initRecyclerView(){
      ...
    }


    @Override
    public void onNoteClick(int position) {
...
    }

    @Override
    public void onClick(View view) {
       ...
    }

    private void deleteNote(Note note) {
       ...
    }

    ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            deleteNote(mNotes.get(viewHolder.getAdapterPosition()));
        }
    };
}

标签: javaandroidandroid-recyclerviewfilter

解决方案


问题是您使用空notesListAll列表来过滤结果;您需要使用构造函数中的注释列表填充它

public NotesRecyclerAdapter(ArrayList<Note> mNotes, OnNoteListener onNoteListener) {
    this.mNotes = mNotes;
    this.mOnNoteListener = onNoteListener;
    this.notesListAll = new ArrayList<>(); // <---- Empty list
    notesListAll.addAll(mNotes); // <--- Fix is here
}

此外,您基于 进行过滤getContent(),可能搜索到的文本不是该内容的一部分,因此您需要过滤掉Note数据类中的一些其他结果。


 if (note.getContent().toLowerCase().contains(charSequence.toString().toLowerCase())) {

推荐阅读