詳解Recyclerview item中有EditText使用刷新遇到的坑
由于工作項(xiàng)目的需要要對(duì)商品購(gòu)買(mǎi)之后添加評(píng)價(jià)的功能,于是自己仿淘寶的評(píng)價(jià)的效果圖作為自己項(xiàng)目中的評(píng)價(jià)效果圖.但是在開(kāi)發(fā)中遇到了一個(gè)大坑,就是在動(dòng)態(tài)添加照片之后,刷新適配器的時(shí)候.item中的EditText中的文字發(fā)生了錯(cuò)亂的現(xiàn)象.最后bug發(fā)現(xiàn)由于如下代碼產(chǎn)生的原因.
/**
* 這是一個(gè)EditText的文本監(jiān)聽(tīng),因?yàn)樵赼ctivity中要獲取文本內(nèi)容,所以設(shè)置了這個(gè)監(jiān)聽(tīng).
* 于是,果斷開(kāi)啟debug模式,最終確認(rèn)確實(shí)是TextWatcher的問(wèn)題,由于調(diào)用了notifyDataSetChanged()方法,而導(dǎo)致EditText重繪,
* 并且每次都走了textWatcher的afterTextChanged()方法.導(dǎo)致EditText中的內(nèi)容發(fā)生了錯(cuò)亂的現(xiàn)象.
*
*/
TextWatcherListener watcher = new TextWatcherListener() {
@Override
public void afterTextChanged(Editable s) {
holder.mEvaluateNumberTv.setText(s.length() + "/100");
if (mOnClickViewListener != null) {
mOnClickViewListener.showEditTextListener(position, s.toString());
}
}
};
holder.mEtEvaluate.setText(mEvaluateProductMap.get(position).getBuyerEvaluate());
holder.mEtEvaluate.addTextChangedListener(watcher);
最后在網(wǎng)上找了很久才知道是Recyclerview條目復(fù)用的時(shí)候?qū)е卤O(jiān)聽(tīng)事件的重繪,所以只需要去掉Recyclerview的復(fù)用就可以完美的解決這個(gè)問(wèn)題餓.但是我們又知道Recyclerview是自帶復(fù)用的怎么去除復(fù)用呢? 只需要在onBindViewHolder(EvaluateHolder holder, int position)中添加如下的的代碼就可強(qiáng)制的停用Recyclerview的復(fù)用,兩種解決方案
第一種就是強(qiáng)制的停用Recyclerview的復(fù)用:
holder.setIsRecyclable(false);
第二種通過(guò)view的setTag()方法解決Recyclerview的復(fù)用代碼如下:
holder.mEtEvaluate.setTag(position);//綁定tag標(biāo)記
holder.mEtEvaluate.clearFocus();
TextWatcherListener watcher = new TextWatcherListener() {
@Override
public void afterTextChanged(Editable s) {
holder.mEvaluateNumberTv.setText(s.length() + "/100");
if (mOnClickViewListener != null) {
mOnClickViewListener.showEditTextListener((int )(holder.mEtEvaluate.getTag()), s.toString()); //通過(guò)tag存儲(chǔ)
}
}
};
holder.mEtEvaluate.addTextChangedListener(watcher);
holder.mEtEvaluate.setText(mEvaluateProductMap.get((holder.mEtEvaluate.getTag())).getBuyerEvaluate()); //通過(guò)控件的tag標(biāo)記獲取值,設(shè)置到控件上
這兩種方法都能解決問(wèn)題,只是方法一只適合條目較少的情況,如果你的條目較多就不太適用了希望我踩的坑能給你有所幫助,大家一起進(jìn)步謝謝!!!!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中使用RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView實(shí)現(xiàn)下拉刷新和上拉加載
- Android RecyclerView 上拉加載更多及下拉刷新功能的實(shí)現(xiàn)方法
- Android使用recyclerview打造真正的下拉刷新上拉加載效果
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- XRecyclerView實(shí)現(xiàn)下拉刷新、滾動(dòng)到底部加載更多等功能
- Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新
- Android RecyclerView的刷新分頁(yè)的實(shí)現(xiàn)
- Android RecyclerView下拉刷新和上拉加載更多
- RecyclerView使用payload實(shí)現(xiàn)局部刷新
相關(guān)文章
Android App開(kāi)發(fā)中自定義View和ViewGroup的實(shí)例教程
這篇文章主要介紹了Android App開(kāi)發(fā)中自定義View和ViewGroup的實(shí)例教程,分別介紹了進(jìn)度條和圖片上傳并排列的例子,效果很好很強(qiáng)大,需要的朋友可以參考下2016-05-05
Android中的深度鏈接技術(shù)實(shí)戰(zhàn)
本文主要介紹了Android中的深度鏈接技術(shù)實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Android Studio 超級(jí)簡(jiǎn)單的打包生成apk的方法
本篇文章主要介紹了Android Studio 超級(jí)簡(jiǎn)單的打包生成apk的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
關(guān)于Android的 DiskLruCache磁盤(pán)緩存機(jī)制原理
DiskLruCache是一種管理數(shù)據(jù)存儲(chǔ)的技術(shù),單從Cache的字面意思也可以理解到,"Cache","高速緩存";今天我們來(lái)從源碼上分析下DiskLruCache;關(guān)于Android LruCache的緩存機(jī)制原理,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
android開(kāi)發(fā)教程之獲取使用當(dāng)前api的應(yīng)用程序名稱
開(kāi)發(fā)手機(jī)安全管家的時(shí)候,比如要打電話,或者照相需要知道是哪個(gè)應(yīng)用程序在調(diào)用,就可以在API接口中調(diào)用下面的代碼2014-02-02
Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解
這篇文章主要介紹了Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解的相關(guān)資料,類似手機(jī)遙控器的需求就可以這么做,需要的朋友可以參考下2016-11-11
Android App中使用ViewPager實(shí)現(xiàn)滑動(dòng)分頁(yè)的要點(diǎn)解析
這篇文章主要介紹了Android App中使用ViewPager實(shí)現(xiàn)滑動(dòng)分頁(yè)的要點(diǎn)解析,還附帶了一個(gè)禁止ViewPager左右滑動(dòng)的方法,需要的朋友可以參考下2016-06-06
Android自定義控件之組合控件學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Android自定義控件之組合控件學(xué)習(xí)筆記,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05

