您的位置:首页 > 移动开发 > Android开发

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!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: