关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法

原创 2016年05月30日 17:14:58

事件描述:当给多个互相联动的EditText之间添加addTextChangedListener 监听时, 各个onTextChanged的调用将陷入无限的死循环当中。

解决思路:当给其中一个添加addTextChangedListener时,移除其他EditText的该事件, 

解决方法:先自定义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;
      }
  }

}

参考链接:http://www.cnblogs.com/LIANQQ/p/3953617.html


之后我们就可以在ListView的Adapter的getView()方法中 对EditText进行监听,简易代码:

ExtendedEditText et = (ExtendedEditText)findViewById(R.id.et);

et.setOnFocusChangeListener(new android.view.View.
		        		OnFocusChangeListener() {
		        	@Override
		        	public void onFocusChange(View v, boolean hasFocus) {
		        		if(et.hasFocus())//获得焦点时给et添加文字改变监听
						{
		        			et.addTextChangedListener(new TextWatcher() {
								
								@Override
								public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
									// TODO Auto-generated method stub
									
									//do something
								}
								
								@Override
								public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
										int arg3) {
									// TODO Auto-generated method stub
									
								}
								
								@Override
								public void afterTextChanged(Editable arg0) {
									// TODO Auto-generated method stub
									
								}
							});
		        			
		        			
						}else{
							et.clearTextChangedListeners();//失去焦点时移除
						}
		        	});



相关文章推荐

ListView中嵌入一个或多个EditText导致数据混乱解决方法

[vio.wang 崇尚开源 尊重原创] 转载请声明出处.     关于ListView嵌入一个或多个EditText导致数据混乱,一直是个一个老生常谈的问题.在开发过程中常遇见,在各个网站上都没有...

联动Listview(实现真正的联动效果)

联动listview 本文主要实现了两个listview联动的效果,类似于美团点菜和城市选择效果,区别于网上很多的不同是右边的listview滑动时左边的listview也会跟着一起滑动。在布局的...

Android listView中 editText 的 addTextChangedListener 和 OnItemClickListener 监听

listview 中如果 要监听某个 editText 的改变,需要注意3个地方: 1、焦点问题 如果需要在外层监听整个子节点的点击事件,又想子节点的editText能修改的话, 不要使用OnI...
  • HuaJack
  • HuaJack
  • 2017年05月21日 22:12
  • 393

Android 解决在ListView历史复用中Edittext数据显示混乱

有这么一个需求,就是在ListView中,每个条目都有Edittext,需要把每个Edittext输入的数据保存到对应的bean中,想要的效果是这样的: 这样一看,也没什么难度嘛,顶多就是在...

安卓解决listview的item嵌套多个edittext的问题

看过很多解决方式,但都会出现无法获取焦点的问题,但合适的只有一种,并且百试不爽,下面会详细介绍: 1、adapter里的关键代码 有两个edit,一个name一个price @Overr...

listview 的复用问题

在不考虑局部刷新的情况下:::::::每次listview在适配器里填充完数据后,当改变其中一个item的数据, 并上下滑动的时候会因为listview的复用问题导致这个或者其他的item的数据又变...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android 实现多个EditText互相监听遇到的问题及解决方法

上周在实现一个功能的时候遇到了很多问题,然后折腾了好久才解决,以防今后又遇上同样的问题特在此记录下。 我实现的功能要求是一个界面上有四个EditText控件,其中任意一个内容变化,其他三个都要根据算...

Android 避免2个相互关联的 EditText 死循环

起因最近在做一个汇率转换的App练手,界面上会有两个相关联的的EditText,改变其中一个的值,另一个也会随之改变。对于这个问题最简单的思路就是为每个EditText附上addTextChanged...

Android 实现多个EditText互相监听遇到的问题及解决方法

上周在实现一个功能的时候遇到了很多问题,然后折腾了好久才解决,以防今后又遇上同样的问题特在此记录下。 我实现的功能要求是一个界面上有四个EditText控件,其中任意一个内容变化,其他三个都要根据算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法
举报原因:
原因补充:

(最多只允许输入30个字)