Android开发技术网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
Android新手教程 Android开发经验 Android开发资讯
Android开发问答 Android实例教程 Framework底层开发
  Android开发资料网 -> Android实例教程 -> Android自定义过滤搜索框的实现 -> 正文阅读
Android实例教程 最新文章
仿ios风格的ToggleButton
Android校验apk文件渠道号、包名、版本号
赤雪情殇
【双11预告】极客学院最惠玩儿,小米插线板
Fresco-加载图片基础—(feecbook图片缓存)
上传照片或者从图库中寻找图片上传服务器
Android自定义过滤搜索框的实现
上传照片或者从图库中寻找图片上传服务器
关于QQ游客和等待邮箱验证会员升级用户组的
小米指南针

[Android实例教程]Android自定义过滤搜索框的实现

  2015-07-07 15:54:03
ListView显示所有内容,上面有一个SearchBox,然后searchbox里输入内容后对下面listview进行过滤。涉及的控件:ListView必须有,EditText用来自定义SearchBox。
布局可以根据自己的喜好定义,主要给大家看看功能实现的代码。过滤功能使用到了Filterable接口,Filter类;要让数据有过滤功能,我们需要在继承的BaseAdapter的基础上再实现Filterable接口的getFilter方法,同时在Adapter内部写一个继承Filter的内部类来完成过滤功能。
private class ListAdapter extends BaseAdapter implements Filterable {            private List<Person> list;                    private Context context;                    private PersonFilter filter;                    public ListAdapter(List<Person> list, Context context) {              this.list = list;              this.context = context;          }            @Override          public int getCount() {              return list.size();          }            @Override          public Object getItem(int position) {              return list.get(position);          }            @Override          public long getItemId(int position) {              return position;          }            @Override          public View getView(int position, View convertView, ViewGroup parent) {              if (convertView == null) {                  convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);              }              Person p = list.get(position);              TextView firstname = (TextView)convertView.findViewById(R.id.firstname);              TextView lastname = (TextView)convertView.findViewById(R.id.lastname);              TextView age = (TextView)convertView.findViewById(R.id.age);                            firstname.setText(p.firstname);              lastname.setText(p.lastname);              age.setText(p.age + "");              return convertView;          }            @Override          public Filter getFilter() {              if (filter == null) {                  filter = new PersonFilter(list);              }              return filter;          }                    private class PersonFilter extends Filter {                            private List<Person> original;                            public PersonFilter(List<Person> list) {                  this.original = list;              }                @Override              protected FilterResults performFiltering(CharSequence constraint) {                  FilterResults results = new FilterResults();                  if (constraint == null || constraint.length() == 0) {                      results.values = original;                      results.count = original.size();                  } else {                      List<Person> mList = new ArrayList<Person>();                      for (Person p: original) {                          if (p.firstname.toUpperCase().startsWith(constraint.toString().toUpperCase())                              || p.lastname.toUpperCase().startsWith(constraint.toString().toUpperCase())                              || new String(p.age + "").toUpperCase().startsWith(constraint.toString().toUpperCase())) {                              mList.add(p);                          }                      }                      results.values = mList;                      results.count = mList.size();                  }                  return results;              }                @Override              protected void publishResults(CharSequence constraint,                      FilterResults results) {                  list = (List<Person>)results.values;                  notifyDataSetChanged();              }                        }      }  
Filter类中的两个方法看名字就是知道一个是执行过滤的,一个刷新listview数据展现结果的。其中我采用了前缀匹配,就是用输入的字符串和ListView里的所有Person的各个属性的前缀做比较。也可以用更加复杂的匹配,例如正则表达式。
关键在于EditText里的数据是如何传入的,要写一个TextWater,并且要让EditText注册一下这个监听器。
private TextWatcher filterTextWatcher = new TextWatcher() {            @Override          public void afterTextChanged(Editable s) {            }            @Override          public void beforeTextChanged(CharSequence s, int start, int count,                  int after) {            }            @Override          public void onTextChanged(CharSequence s, int start, int before,                  int count) {              listAdapter.getFilter().filter(s); //这里传入数据就可以了          }        };  
下面是person类
private class Person {          public String firstname;          public String lastname;          public int age;                    public Person(String firtname, String lastname, int age) {              this.firstname = firtname;              this.lastname = lastname;              this.age = age;          }      }  
listview_item布局可以用textview显示文字

啊啊啊啊啊啊啊啊啊啊啊啊

没有效果图

未雨天 发表于 2015-4-26 10:20
没有效果图
所以自己一练习,效果图不就有喽

a258989165 发表于 2015-4-25 10:43
啊啊啊啊啊啊啊啊啊啊啊啊

淡定啊!

主activity都没得,能否上传一下你的源码,供学习下

eshuihanbing 发表于 2015-4-27 09:32
主activity都没得,能否上传一下你的源码,供学习下
public class MainActivity extends Activity {
        private ListView listview;      
        private EditText edittext;       //输入框
        private ImageButton btn_search;       //搜索图标
        private ListAdapter myAdapter;
        private ArrayList<Person> list;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                initial();       //初始化控件
                edittext.addTextChangedListener(new TextWatcher() {
                        @Override
                        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                        int arg3) {
                                // TODO Auto-generated method stub
                        }
                        @Override
                        public void beforeTextChanged(CharSequence arg0, int arg1,
                                        int arg2, int arg3) {
                                // TODO Auto-generated method stub
                        }
                        @Override
                        public void afterTextChanged(Editable s) {
                                // TODO Auto-generated method stub
                                myAdapter.getFilter().filter(s); // 这里传入数据就可以了
                        }
                });
        }
        private void initial() {
                listview = (ListView) this.findViewById(R.id.listview);
                edittext = (EditText) this.findViewById(R.id.search_text);
                btn_search = (ImageButton) this.findViewById(R.id.search_btn);
                setData();
                myAdapter = new ListAdapter(list, this);
                listview.setAdapter(myAdapter);
        }
       //给listview设置数据
        private void setData() {
                list = new ArrayList<Person>();
                Person ps1 = new Person("Joke", "Li", 23);
                Person ps2 = new Person("John", "Su", 24);
                Person ps3 = new Person("LiLy", "Huang", 20);
                Person ps4 = new Person("Linda", "Zhang", 32);
                Person ps5 = new Person("John", "Shi", 32);
                Person ps6 = new Person("Joke", "Guo", 31);
                Person ps7 = new Person("Jeck", "Huang", 26);
                Person ps8 = new Person("Hebe", "Feng", 21);
                Person ps9 = new Person("Jay", "Li", 21);
                Person ps10 = new Person("Susan", "Shi", 27);
                Person ps11 = new Person("Willim", "Zhang", 27);
                Person ps12 = new Person("Kiki", "Zhao", 20);
                list.add(ps1);
                list.add(ps2);
                list.add(ps3);
                list.add(ps4);
                list.add(ps5);
                list.add(ps6);
                list.add(ps7);
                list.add(ps8);
                list.add(ps9);
                list.add(ps10);
                list.add(ps11);
                list.add(ps12);
        }
为了方便我把数据写成固定的了,可以根据自己情况从服务器端获取就好

没有下载包吗,看看有没有

895483316 发表于 2015-5-3 15:51
没有下载包吗,看看有没有
自定义过滤搜索框的实例

有没有demo下载呀

啊啊啊啊啊啊啊啊啊啊啊啊

不错,学习了,顶一顶~~

看一看,瞧一瞧

你们有没有发现一个问题,如果使用过滤,怎么才能实现点击事件是你点击当前的item,而不是你没过滤前的item

是不是要把onitemclick 点击事件写在适配器里面 ?

上一篇文章      下一篇文章      查看所有文章
2015-04-22 12:39:06  
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-23 17:47:06
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  Android开发资料网