Android中级第二讲--制作搜索页面,使用TextWatcher
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved !
大家好,如果有人因为要做一个随“输入框内容改变”,带动相关数据同时也发生改变的搜索页面,而不知所措的时候,那么可以来看看这篇博客。
大家可能都用过onClickListener或者onItemClickListener,那些是用来绑定按钮或者列表的,用来响应一些反应
那么TextWatcher呢,是专门用在输入框上的。现在就带大家来学习一下提高课程。
首先,声明一个EditText并且绑定TextWatcher。注意不是set而是add
contact_search.addTextChangedListener(mTextwatcher);
然后,重构TextWatcher
/** * 搜索框事件 */ private TextWatcher mTextwatcher = new TextWatcher() { @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub myAdapter.notifyDataSetChanged(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub // 进行一些输入前的准备,比如声明adapter,new一个progressbar等 if (myAdapter == null) { myAdapter = new MyAdapter(); list.setAdapter(myAdapter); } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub String query = s.toString().trim(); if (!TextUtils.isEmpty(query)) { //用来获取给adapter绑定的数据 } else { //用来获取当前页面应有的数据 } } };
大家可以看到TextWatcher呢,有三个内部方法beforeTextChanged,onTextChanged,afterTextChanged,根据名字我们就可以知道他们的意思,在输入框内容变化前,变化时,变化后所应采取的操作
一般我们可以在变化前声明好adapter,不过我们一般也会在oncreate或者onstart方法里面声明,但如果此页面只显示搜索数据而不显示其他的时候,可以在这里声明
变化时,如上面代码,不为空时查找数据,为空时进行提示
变化后,我们可以操作adapter进行数据刷新,为什么要用myAdapter.notifyDataSetChanged();呢,这里涉及了一个知识点,adapter继承自baseAdapter ,声明后,对象已经存在,如果数据改变再声明再绑定会浪费系统内存,所以系统提供了notifyDataSetChanged这个方法来刷新数据。
主要代码就在上面,欢迎大家一起探讨学习!