android EditText监听事件处理方法
2018-03-22 09:18
465 查看
最近,项目需要修改一个bug,就是在edittext中监听用户输入,输入完了后就进行网络查询,我拿到手的项目的时候,之前的三个人不知道是谁写的,也都没有改,首先看下edittext的监听输入方法之一
inputText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
他们的做法是在afterTextChanged()方法中进行查询操作,要知道,这个方法回调是在只要edittext中有变化都会执行,拿一个电话号码查询例子来说,用户如果输11位,那么就要查询11次,用于展示搜索结果的adapter就会刷新11次,当用户输入的快慢不同,这个adapter中list所带的查询返回的数据是肯定会用问题的,查询的数据池中,数据可能只有几十条么?况且不说网络状况好用户当前手机的内存的问题,所以这种做法是一定不能用的。
我的做法是,用handler+延时,下面请看:
private InputHandler mInputHandler = new InputHandler();
private boolean flags= false;//判断用户两次输入的时差是否大于500ms的标志
private long firstTime;//第一次的时间
......
inputText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
firstTime= System.currentTimeMillis();
if (!flags) {//已经进行了一次查询操作,就不在查询了
doQurry();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
private class InputHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1://1输入完成
doQurry();
break;
}
}
}
/*
*延时操作
**/
private void doQurry() {
flags= true; //一进入这个方法就置为true,表示已经执行过了,如果不置为true,则会一直执行这个方法,要出大问题
if (System.currentTimeMillis() - firstTime> 500) {//当前时间和上一次输入的时差大于500ms就
getUserData();
flags= false;//重置为false,如果用户有新的输入才能进行下次查询,一定不要忘记这个flags
} else {
mInputHandler.sendEmptyMessageDelayed(1, 300);//edittext改变了,但是时间小于500ms(表示用户输入太快,在时间间隔的500ms内不查询)就每隔300ms给handler发送一次消息,直到这次操作完了进行一次查询操作完成。
}
}
/*
*网络查询操作,这个方法里面做你想做的事情
**/
private void getUserData(){
}
好了,上面就是我的操作,我想说下:作为一个程序员,做事情还是有点责任心,不要弄些表象,遇到问题总想偷懒,不找合理的解决方法,你提升技能很慢的,另外,程序员,不应该只有代码和电脑,还应该有年轻人应该有的活力,come on!!!
inputText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
他们的做法是在afterTextChanged()方法中进行查询操作,要知道,这个方法回调是在只要edittext中有变化都会执行,拿一个电话号码查询例子来说,用户如果输11位,那么就要查询11次,用于展示搜索结果的adapter就会刷新11次,当用户输入的快慢不同,这个adapter中list所带的查询返回的数据是肯定会用问题的,查询的数据池中,数据可能只有几十条么?况且不说网络状况好用户当前手机的内存的问题,所以这种做法是一定不能用的。
我的做法是,用handler+延时,下面请看:
private InputHandler mInputHandler = new InputHandler();
private boolean flags= false;//判断用户两次输入的时差是否大于500ms的标志
private long firstTime;//第一次的时间
......
inputText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
firstTime= System.currentTimeMillis();
if (!flags) {//已经进行了一次查询操作,就不在查询了
doQurry();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
private class InputHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1://1输入完成
doQurry();
break;
}
}
}
/*
*延时操作
**/
private void doQurry() {
flags= true; //一进入这个方法就置为true,表示已经执行过了,如果不置为true,则会一直执行这个方法,要出大问题
if (System.currentTimeMillis() - firstTime> 500) {//当前时间和上一次输入的时差大于500ms就
getUserData();
flags= false;//重置为false,如果用户有新的输入才能进行下次查询,一定不要忘记这个flags
} else {
mInputHandler.sendEmptyMessageDelayed(1, 300);//edittext改变了,但是时间小于500ms(表示用户输入太快,在时间间隔的500ms内不查询)就每隔300ms给handler发送一次消息,直到这次操作完了进行一次查询操作完成。
}
}
/*
*网络查询操作,这个方法里面做你想做的事情
**/
private void getUserData(){
}
好了,上面就是我的操作,我想说下:作为一个程序员,做事情还是有点责任心,不要弄些表象,遇到问题总想偷懒,不找合理的解决方法,你提升技能很慢的,另外,程序员,不应该只有代码和电脑,还应该有年轻人应该有的活力,come on!!!
相关文章推荐
- Android EditText截获与监听输入事件
- 【Android基础】EditText键盘搜索事件设置和监听
- 【转】Android EditText截获与监听输入事件
- android监听edittext输入事件
- Android TextView指定的文字监听事件处理 TextViewClickable
- 全面解析Android中对EditText输入实现监听的方法
- Android编程实现监听EditText变化的方法
- android 中动态监听Edittext控件内容长度 TextWatcher监听事件
- Android:EditText 软键盘退出监听解决方法
- Android之EditText文本框监听事件
- android EditText监听和长度监测事件
- Android中EditText监听软键盘的事件
- Android 实现多个EditText互相监听遇到的问题及解决方法
- Android应用开发EditText文本内容变化监听方法
- Android EditText缴获与监听输入事件
- android中EditText文本监听的方法:addTextChangedListener()
- Android EditText监听焦点事件
- Android UI事件处理——实现事件监听接口的4种方法
- Android:EditText输入事件截获与监听
- Android 处理简单单击事件的监听方法