你想想,對于addTextChangedListener這個方法懂衩,你每次對edittext進行setText操作后都會調(diào)用這個方法拳昌,不巧的是recyclerview是復用容器憨奸,數(shù)據(jù)超出可用的容器時零抬,會對edittext進行復用,也就是說题翻,我們本身只想在addTextChangedListener中去監(jiān)聽手動改變edittext的情況揩徊,而recyclerview重復調(diào)用setText也會導致默認調(diào)用addTextChangedListener而會產(chǎn)生嚴重的數(shù)據(jù)錯亂。
方法1 (還是有缺陷)來自于:[junerver] http://www.reibang.com/p/af820fb21e62
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final AssessCheckListBean.CheckBean taskBean = dataList.get(position);
holder.tv_check_title.setText(taskBean.getTeachername());
/*RecyclerView中監(jiān)聽多個EditText變化的BUG
*解決方案:在每次填充數(shù)據(jù)時嵌赠,先移除TextWatcher 監(jiān)聽器塑荒,然后為 EditText 填充數(shù)據(jù) ,最后在為 EditText 添加 TextWatcher 監(jiān)聽器姜挺;
* */
if (holder.et_check_score.getTag() instanceof TextWatcher) {
holder.et_check_score.removeTextChangedListener((TextWatcher) holder.et_check_score.getTag());
}
holder.et_check_score.setText(taskBean.getTeacherscore() + "");
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
taskBean.setTeacherscore(holder.et_check_score.getText().toString());
}
};
holder.et_check_score.addTextChangedListener(watcher);
holder.et_check_score.setTag(watcher);
}
方法2 (推薦)鏈接:http://www.reibang.com/p/19894620a0ec
個人更傾向第二種(emmm....因為優(yōu)雅)
第二種就是給item種的EiditText注冊焦點監(jiān)聽
1齿税、在有焦點時添加TextWatcher,失去焦點時添加TextWatcher炊豪,同時記錄當前焦點的位置focusPosition凌箕。
2、TextWatcher的afterTextChanged()中把輸入數(shù)據(jù)存入SpareArray词渤。這里有個小坑牵舱,之前會在afterTextChanged() 又給EidtText設置文本,導致了OOM缺虐,完全沒必要芜壁,只要在對應item里獲取數(shù)組中相應位置數(shù)據(jù)即可。
image.png
image.png