Android ListView 自定义适配器实现高效过滤搜索功能
public class NodeAdapter extends BaseAdapter implements Filterable {
private Context mContext;
private List<Note> backList;//用来备份原始数据
private List<Note> noteList;//数据会改变,要有变量来备份原始数据
private MyFilter mFilter;
public NodeAdapter(Context mContext, List<Note> noteList){
this.mContext = mContext;
this.noteList = noteList;
backList = noteList;
}
@Override
public int getCount(){
return noteList.size();
}
@Override
public Object getItem(int position){
return noteList.get(position);
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position , View convertView, ViewGroup parent){
View v=View.inflate(mContext,R.layout.note_layout,null);
TextView tv_content =(TextView) v.findViewById(R.id.tv_content);
TextView tv_time =(TextView) v.findViewById(R.id.tv_time);
String allText = noteList.get(position).getContent();
tv_content.setText(allText);
tv_time.setText(noteList.get(position).getTime());
//save note id to tag
v.setTag(noteList.get(position).getId());
return v;
}
@Override
public Filter getFilter(){
if(mFilter==null){
mFilter= new MyFilter();
}
return mFilter;
}
class MyFilter extends Filter{
//在performFiltering(CharSequence charsequence)这个方法中定义过滤规则
@Override
protected FilterResults performFiltering(CharSequence charSequence){
FilterResults results =new FilterResults();
List<Note> list;
if(TextUtils.isEmpty(charSequence)){//当过滤的关键字为空的时候,显示所有的数据
list =backList;
}
else {//否则把符合条件的数据对象添加到集合中
list =new ArrayList<>();
for(Note note :backList){
if (note.getContent().contains(charSequence)){
list.add(note);
}
}
}
results.values =list;//将得到的集合保存到FilterResults的values变量中
results.count =list.size();//将集合的大小保存到FilterResults的count变量中
return results;
}
//在publishResults方法中告诉适配器更新界面
@Override
protected void publishResults(CharSequence charSequence,FilterResults filterResults){
noteList = (List<Note>)filterResults.values;
if(filterResults.count>0){
notifyDataSetChanged();//通知数据发生了改变
}
else {
notifyDataSetInvalidated();//通知数据失败
}
}
}
}
这段代码展示了一个自定义的Android ListView适配器NodeAdapter,用于显示笔记列表并实现搜索过滤功能。
主要功能:
- 数据绑定: 将笔记数据(
Note对象列表)绑定到ListView的每个条目上,显示笔记内容和时间。 - 过滤搜索: 通过实现
Filterable接口,实现了对笔记内容的实时过滤搜索功能。
代码解析:
backList和noteList:backList用于保存原始的笔记数据,noteList用于保存经过过滤后的数据,确保在搜索过程中原始数据不会被修改。getView()方法: 负责加载每个笔记条目的布局,并将Note对象的数据设置到对应的TextView控件上。getFilter()方法: 返回一个自定义的过滤器MyFilter,用于处理搜索过滤逻辑。MyFilter类:performFiltering()方法:根据输入的搜索关键字过滤笔记列表,将符合条件的笔记添加到新的列表中。publishResults()方法:将过滤后的结果更新到noteList中,并通知适配器数据已更改,刷新ListView显示。
使用方法:
- 创建
NodeAdapter实例,并将笔记数据列表传入。 - 将
NodeAdapter设置给ListView。 - 使用
getFilter()方法获取过滤器,并调用filter()方法进行搜索过滤。
注意:
- 需要在
MainActivity或其他使用该适配器的类中处理数据更新逻辑,并在数据更新后调用notifyDataSetChanged()方法通知适配器刷新ListView。 - 可以根据实际需求修改
performFiltering()方法中的过滤逻辑,例如实现按时间、标签等条件过滤。
原文地址: https://www.cveoy.top/t/topic/cvh5 著作权归作者所有。请勿转载和采集!