DevUtils Github
解决 Adapter 多个 Item 存在 EditText 监听输入问题 -> EditTextWatcherAssist.java
方法注释
bindListener绑定事件
package dev
.assist
;
import android
.text
.Editable
;
import android
.text
.TextUtils
;
import android
.text
.TextWatcher
;
import android
.view
.View
;
import android
.widget
.EditText
;
public class EditTextWatcherAssist<T> {
public void bindListener(final CharSequence text
, final int position
,
final EditText editText
, final InputListener
<T> listener
) {
bindListener(text
, position
, editText
, null
, listener
);
}
public void bindListener(final CharSequence text
, final int position
,
final EditText editText
, final T object
, final InputListener
<T> listener
) {
if (editText
!= null
) {
editText
.setText(TextUtils
.isEmpty(text
) ? "" : text
);
editText
.clearFocus();
editText
.setOnFocusChangeListener(new FocusListener(position
, editText
, object
, listener
));
}
}
public interface InputListener<T> {
void onTextChanged(CharSequence charSequence
, EditText editText
, int position
, T object
);
}
private TextWatcher mTextWatcher
;
private EditText mFocusEdit
;
private int mFocusPos
;
private void focusChange(final EditText editText
, final int position
) {
if (mTextWatcher
!= null
) {
if (mFocusEdit
!= null
) {
mFocusEdit
.removeTextChangedListener(mTextWatcher
);
}
mTextWatcher
= null
;
}
mFocusEdit
= editText
;
mFocusPos
= position
;
}
private class FocusListener implements View.OnFocusChangeListener {
private int position
;
private EditText editText
;
private T object
;
private InputListener
<T> listener
;
public FocusListener(int position
, EditText editText
, T object
, InputListener
<T> listener
) {
this.position
= position
;
this.editText
= editText
;
this.object
= object
;
this.listener
= listener
;
}
@Override
public void onFocusChange(View v
, boolean hasFocus
) {
if (hasFocus
) {
focusChange(editText
, position
);
if (mTextWatcher
== null
) {
mTextWatcher
= new TextWatcher() {
@Override
public void onTextChanged(CharSequence charSequence
, int start
, int before
, int count
) {
if (mFocusPos
== position
) {
if (listener
!= null
) {
listener
.onTextChanged(charSequence
, editText
, position
, object
);
}
}
}
@Override
public void beforeTextChanged(CharSequence s
, int start
, int count
, int after
) {
}
@Override
public void afterTextChanged(Editable s
) {
}
};
}
if (mFocusEdit
!= null
) {
mFocusEdit
.addTextChangedListener(mTextWatcher
);
}
} else {
focusChange(null
, -1);
}
}
}
}