由于工作項(xiàng)目的需要要對(duì)商品購買之后添加評(píng)價(jià)的功能,于是自己仿淘寶的評(píng)價(jià)的效果圖作為自己項(xiàng)目中的評(píng)價(jià)效果圖.但是在開發(fā)中遇到了一個(gè)大坑,就是在動(dòng)態(tài)添加照片之后,刷新適配器的時(shí)候.item中的EditText中的文字發(fā)生了錯(cuò)亂的現(xiàn)象.最后bug發(fā)現(xiàn)由于如下代碼產(chǎn)生的原因.
為灌云等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及灌云網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、灌云網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
/** * 這是一個(gè)EditText的文本監(jiān)聽,因?yàn)樵赼ctivity中要獲取文本內(nèi)容,所以設(shè)置了這個(gè)監(jiān)聽. * 于是,果斷開啟debug模式,最終確認(rèn)確實(shí)是TextWatcher的問題,由于調(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)聽事件的重繪,所以只需要去掉Recyclerview的復(fù)用就可以完美的解決這個(gè)問題餓.但是我們又知道Recyclerview是自帶復(fù)用的怎么去除復(fù)用呢? 只需要在onBindViewHolder(EvaluateHolder holder, int position)中添加如下的的代碼就可強(qiáng)制的停用Recyclerview的復(fù)用,兩種解決方案
第一種就是強(qiáng)制的停用Recyclerview的復(fù)用:
holder.setIsRecyclable(false);
第二種通過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()); //通過tag存儲(chǔ) } } }; holder.mEtEvaluate.addTextChangedListener(watcher); holder.mEtEvaluate.setText(mEvaluateProductMap.get((holder.mEtEvaluate.getTag())).getBuyerEvaluate()); //通過控件的tag標(biāo)記獲取值,設(shè)置到控件上
這兩種方法都能解決問題,只是方法一只適合條目較少的情況,如果你的條目較多就不太適用了希望我踩的坑能給你有所幫助,大家一起進(jìn)步謝謝!!!!
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。