java - 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()));
}
};
}
解决方案
问题是您使用空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())) {
推荐阅读
- sql - SELECT - 行数过多
- powerbi-desktop - 使用 DAX 计算以前日期(月中和月末)的销售额
- javascript - 如何启动这个 Node.JS 应用程序?
- python - 如何在 Jupyter 中从 PILLOW 导入图像?
- java - 为什么打印数组列表时会在开头打印逗号?
- java - 递归中的预增量 (++i) 和 i + 1。为什么他们有不同的行动?StackOverFlow 错误
- python - 我可以在 MongoDB 的单个文档中插入列表吗?
- spring-boot - 从 Spring 工具集 4 访问 tomcat 管理页面
- sql - 根据某些条件从存储过程创建数据库
- node.js - 从多个表中续集销毁