大家好,如果有人因为要做一个随“输入框内容改变”,带动相关数据同时也发生改变的搜索页面,而不知所措的时候,那么可以来看看这篇博客。
大家可能都用过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这个方法来刷新数据。