需求
在项目中,需要实现在表格,并监听表格输入文本的功能。
问题
使用了RecycleView,在Item中加入Edit并使用TextWatcher监听输入。
刚开始没有问题,但是多次删减item之后,发现偶现编辑单个item中的EditText,列表中多个其他item文本也同步变更。
原因
由于EditText只能addTextChangedLister,所以当遇到RecycleView等item复用时,可能多个item的EditText有添加了多个TextWatcher,导致在修改一项item时,有多个TextWatcher生效,从而导致数据更新混乱。
解决思路
可以在adapter中,每次设置TextWatcher时,先删除原有的TextWatcher。
同时,也可以监听当前EditText是否有获取到焦点,如果有的话,再添加监听,否则移除监听。
editText.setOnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
// 获取到了焦点,开始监听输入内容
val textWatcher = editText.addTextChangedListener(
afterTextChanged = {
// TODO 监听到输入内容后,执行需要的逻辑
}
)
editText.tag = textWatcher
} else {
// 失去到了焦点,停止监听输入内容
val textWatcher = editText.tag
if (textWatcher is TextWatcher) {
// 清除当前EditText的监听
editText.removeTextChangedListener(textWatcher)
editText.tag = null
}
}
}