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 生肖星座解梦
 三沣玩客 三沣拍拍 视频热点 软件开发资料 Android开发资料 站长资讯网 古典小说 网文精选 搜图网 天下美图 中国文化英文网站 多播视频
 2017-1-17 18:53:02
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  Android开发资料网