android EditText监听事件处理方法

最近,项目需要修改一个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!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值