假设本地存了很多数据,按关键字搜索,而且要求自动搜索,没有搜索按钮,输入法上也没有,就要求这种体验,当你输入一个字符的时候,EditText的addTextChangedListener其实就开始监听了,比如你想搜索abc ,其实查询了三次数据库,先搜a,再ab,然后才是abc。这当然不合理,其实假设从网络拉取数据,这样也是不合理的。解决方案是加入Handler 来处理。代码如下:
searchInput.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 s, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable edit) {
searchInput.requestFocus();
handler.removeMessages(TRIGGER_SERACH);
if (!TextUtils.isEmpty(edit.toString())
{
handler.sendEmptyMessageDelayed(TRIGGER_SERACH, 400);
}
});
每次先remove消息,在延迟400ms发送消息,这样就可以大大优化了,连续输入造成的多次取数据库。然后在handler收消息的地方处理数据库或者网络请求的操作。代买如下:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
// super.handleMessage(msg);
switch (msg.what) {
case TRIGGER_SERACH:
getSearchData();
break;
}
}
};