事件描述:当给多个互相联动的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();//失去焦点时移除
}
});