zoukankan      html  css  js  c++  java
  • 关于多个EditText的OnTextChange事件陷入死循环的处理

    需求:ListView的Item上面有三个EditText控件,分别为 数量 ,单价,总价,要求输入数量跟单价时候 总价跟着计算变化,当输入总价时候 数量不变,改变单价。

    实现:首先肯定想到的是对EditText进行监听,实现TextWatcher接口,在onTextChanged 方法中进行计算,由于三个EditText存在关联,肯定要监听3个,如果处理不好的话,改变一个值,其他的值也改变,这样会陷入一个死循环。虽然有removeTextChangedListener 这个方法,但是实在不敢恭维,容易出错。最好的办法当然是 当一个EditText获得焦点时候先清除所有的OnTextChanged监听 然后addTextChangedListener。这样就能保证始终只有一个EditText获得监听,而不会陷入死循环中。看了下源代码,google并没有提供清除所有监听的方法,只能自己实现一个了。

    自定义EditText控件,调用clearTextChangedListeners() 这个方法即可清除所有实现TextWatcher的监听。

    package com.Ieasy.Tool;
    
    import java.util.ArrayList;
    
    import android.content.Context;
    import android.text.TextWatcher;
    import android.util.AttributeSet;
    import android.widget.EditText;
    
    public class ExtendedEditText extends EditText {
      
      private ArrayList<TextWatcher> mListeners = null;
    
      public ExtendedEditText(Context ctx)
      {
          super(ctx);
      }
    
      public ExtendedEditText(Context ctx, AttributeSet attrs)
      {
          super(ctx, attrs);
      }
    
      public ExtendedEditText(Context ctx, AttributeSet attrs, int defStyle)
      {       
          super(ctx, attrs, defStyle);
      }
    
      @Override
      public void addTextChangedListener(TextWatcher watcher)
      {       
          if (mListeners == null) 
          {
              mListeners = new ArrayList<TextWatcher>();
          }
          mListeners.add(watcher);
    
          super.addTextChangedListener(watcher);
      }
    
      @Override
      public void removeTextChangedListener(TextWatcher watcher)
      {       
          if (mListeners != null) 
          {
              int i = mListeners.indexOf(watcher);
              if (i >= 0) 
              {
                  mListeners.remove(i);
              }
          }
    
          super.removeTextChangedListener(watcher);
      }
    
      public void clearTextChangedListeners()
      {
          if(mListeners != null)
          {
              for(TextWatcher watcher : mListeners)
              {
                  super.removeTextChangedListener(watcher);
              }
    
              mListeners.clear();
              mListeners = null;
          }
      }
    
    }
  • 相关阅读:
    deepin 系统更新命令
    安装mongdb
    读model所得
    上周某一天
    在项目中直接执行里面的文件
    数据库(六)
    数据库(五)
    数据库(四)
    数据库(三)
    数据库(二)
  • 原文地址:https://www.cnblogs.com/LIANQQ/p/3953617.html
Copyright © 2011-2022 走看看