[15]——踩坑記-在 RecyclerView 中使用 EditText 滾動(dòng)后數(shù)據(jù)消失

項(xiàng)目中有一個(gè)頁面實(shí)現(xiàn)的是用戶為教師打分的功能嘶是,頁面使用 RecyclerView 來實(shí)現(xiàn)的,由于這個(gè)功能一直沒有正式上線使用竿奏,所以接手之后我也沒有注意過這段代碼是否存在問題荠耽。在前段時(shí)間上線使用之后,今天用戶反應(yīng)說這個(gè)頁面存在 crash豺谈,遂檢查修復(fù)郑象。

發(fā)現(xiàn)只是一個(gè)簡(jiǎn)單的空指針錯(cuò)誤(原來負(fù)責(zé)項(xiàng)目的人對(duì)空指針的判斷已經(jīng)坑我若干次了...),修復(fù)之后進(jìn)行了簡(jiǎn)單的測(cè)試茬末,發(fā)現(xiàn)還存在這另一個(gè)問題:在 EditText 中修改分值后厂榛,如果滾動(dòng) RecyclerView 再次回到該處的時(shí)候,EditText 中的內(nèi)容被置為 0 了丽惭』髂蹋坑里有坑!這就很尷尬了吐根,這個(gè)項(xiàng)目的前任工程師真是挖了一個(gè)很大的坑啊正歼。

當(dāng)遇到這個(gè)問題的時(shí)候,我也有點(diǎn)一頭霧水拷橘,于是檢查代碼局义,其中與 EditText 的操作都是在 Adapter 中的,關(guān)鍵代碼如下所示:

@Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final AssessCheckListBean.CheckBean taskBean = dataList.get(position);
        holder.tv_check_title.setText(taskBean.getTeachername());
        holder.et_check_score.setText(taskBean.getTeacherscore() + "");
        holder.et_check_score.addTextChangedListener(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());
            }
        });
    }

可以看出是在 onBindViewHolder 中為 EditText 添加了一個(gè) TextWatcher冗疮,用來在用戶輸入后將數(shù)據(jù)取出寫入到 列表數(shù)據(jù)中萄唇。

乍一看這段代碼沒有什么問題,但實(shí)際上這里有一個(gè)很大的坑术幔。通過在 afterTextChanged 方法上增加 Log 記錄可以發(fā)現(xiàn)另萤,該方法會(huì)被多次的調(diào)用,并且在滑動(dòng)后最終結(jié)果變成 0 诅挑,其根本原因是因?yàn)?EditText 的重新繪制四敞!當(dāng)重繪之后 該回調(diào)函數(shù)沒有獲取到填充的數(shù)據(jù),從而導(dǎo)致了數(shù)值都被置為 0 了拔妥。

解決方法很簡(jiǎn)單忿危,我們只要在每次填充數(shù)據(jù)之前先移除 TextWatcher 監(jiān)聽器,然后為 EditText 填充數(shù)據(jù) 没龙,最后在為 EditText 添加 TextWatcher 監(jiān)聽器铺厨,代碼如下所示:

@Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final AssessCheckListBean.CheckBean taskBean = dataList.get(position);
        holder.tv_check_title.setText(taskBean.getTeachername());
        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);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缎玫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子解滓,更是在濱河造成了極大的恐慌赃磨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洼裤,死亡現(xiàn)場(chǎng)離奇詭異邻辉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逸邦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門恩沛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缕减,你說我怎么就攤上這事雷客。” “怎么了桥狡?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)裹芝。 經(jīng)常有香客問我,道長(zhǎng)嫂易,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任怜械,我火速辦了婚禮颅和,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缕允。我一直安慰自己峡扩,他們只是感情好障本,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驾霜,像睡著了一般案训。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粪糙,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天萤衰,我揣著相機(jī)與錄音猜旬,去河邊找鬼脆栋。 笑死洒擦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熟嫩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼椅邓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了昧狮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤合住,失蹤者是張志新(化名)和其女友劉穎撒璧,沒想到半個(gè)月后透葛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿樱,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年萨蚕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涉馁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门岔。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寒随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻往,到底是詐尸還是另有隱情,我是刑警寧澤讯泣,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布阅悍,位于F島的核電站好渠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏假栓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一匾荆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牙丽,春花似錦、人聲如沸烤芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺良。三九已至绰播,卻和暖如春尚困,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背事甜。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻谦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓贱鼻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親邻悬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容