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接口,实现了对笔记内容的实时过滤搜索功能。

代码解析:

  1. backListnoteList: backList用于保存原始的笔记数据,noteList用于保存经过过滤后的数据,确保在搜索过程中原始数据不会被修改。
  2. getView()方法: 负责加载每个笔记条目的布局,并将Note对象的数据设置到对应的TextView控件上。
  3. getFilter()方法: 返回一个自定义的过滤器MyFilter,用于处理搜索过滤逻辑。
  4. MyFilter类:
    • performFiltering()方法:根据输入的搜索关键字过滤笔记列表,将符合条件的笔记添加到新的列表中。
    • publishResults()方法:将过滤后的结果更新到noteList中,并通知适配器数据已更改,刷新ListView显示。

使用方法:

  1. 创建NodeAdapter实例,并将笔记数据列表传入。
  2. NodeAdapter设置给ListView。
  3. 使用getFilter()方法获取过滤器,并调用filter()方法进行搜索过滤。

注意:

  • 需要在MainActivity或其他使用该适配器的类中处理数据更新逻辑,并在数据更新后调用notifyDataSetChanged()方法通知适配器刷新ListView。
  • 可以根据实际需求修改performFiltering()方法中的过滤逻辑,例如实现按时间、标签等条件过滤。
Android ListView 自定义适配器实现高效过滤搜索功能

原文地址: https://www.cveoy.top/t/topic/cvh5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录