最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RecyclerView中監(jiān)聽EditText變化的BUG的解決方法

 更新時(shí)間:2017年11月29日 14:50:17   作者:鍵盤上的麒麟臂  
本篇文章主要介紹了RecyclerView中監(jiān)聽EditText變化的BUG的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

需求:有一個(gè)列表,列表中有一個(gè)edittext(只能輸整形),外部有一個(gè)整形變量Int,每次改變列表中其中一項(xiàng)的edittext的值時(shí),外部的Int都會(huì)改變。

既然這樣,我們就需要對(duì)edittext進(jìn)行addTextChangedListener監(jiān)聽,一般做法是在afterTextChanged中對(duì)外部進(jìn)行循環(huán)累加,但是想想,每一次你改變edittext都要進(jìn)行一次時(shí)間復(fù)雜度為n的循環(huán)的話,想想就覺得這個(gè)算法很那啥,所以我想了另一個(gè)算法,每次改變其中一個(gè)item的值時(shí),用總的值減去原item的edittext中的值加上item的edittext新輸入的值,這樣的復(fù)雜度為1,看著就很舒服。

但是這樣也引出了一個(gè)問題,就是今天要說(shuō)的BUG

我要講的BUG是RecyclerView導(dǎo)致數(shù)據(jù)錯(cuò)亂的問題

我要講的BUG是RecyclerView導(dǎo)致數(shù)據(jù)錯(cuò)亂的問題

我要講的BUG是RecyclerView導(dǎo)致數(shù)據(jù)錯(cuò)亂的問題

重要事情說(shuō)三遍

你想想,對(duì)于addTextChangedListener這個(gè)方法,你每次對(duì)edittext進(jìn)行setText操作后都會(huì)調(diào)用這個(gè)方法,不巧的是recyclerview是復(fù)用容器,數(shù)據(jù)超出可用的容器時(shí),會(huì)對(duì)edittext進(jìn)行復(fù)用,也就是說(shuō),我們本身只想在addTextChangedListener中去監(jiān)聽手動(dòng)改變edittext的情況,而recyclerview重復(fù)調(diào)用setText也會(huì)導(dǎo)致默認(rèn)調(diào)用addTextChangedListener而會(huì)產(chǎn)生嚴(yán)重的數(shù)據(jù)錯(cuò)亂。

舉個(gè)栗子,對(duì)我的需求原本是做這樣的操作。

edtItem.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
             // todo 獲取到edit改變前的數(shù)字
             String befour = edtItem.getText().toString();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
             // todo 獲取到edit改后的數(shù)字
             String now = edtItem.getText().toString();
        }
      });

這樣拿到當(dāng)前Item改變前的數(shù)字和改變后的數(shù)字,傳給外部(傳的做法我這沒寫,可以用觀察者),然后外部總int - befour + now 就能獲取到新的總數(shù)。

這邏輯看是完美,但是recyclerview幫你settext時(shí),你的befour就是復(fù)用前的item中的數(shù),而now就是新settext上去的數(shù)。
簡(jiǎn)單來(lái)說(shuō),我們要的效果是手動(dòng)修改editText時(shí)才進(jìn)行int - befour + now步驟,而現(xiàn)在你光滑動(dòng)就莫名其妙進(jìn)行int - 復(fù)用前item的數(shù) + 復(fù)用后item的數(shù)。

那我們就需要解決一個(gè)問題,只有手動(dòng)修改edittext時(shí),才進(jìn)行正確的操作,滑動(dòng)時(shí),不進(jìn)行操作
其實(shí)我以前有說(shuō)過(guò)reyclerview不能直接對(duì)它的容器進(jìn)行操作(也就是viewholder),而應(yīng)該對(duì)它的數(shù)據(jù)進(jìn)行操作。所以這里我們改成這樣的話,就不會(huì)受到滑動(dòng)更新數(shù)據(jù)的影響。

edtItem.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
             // todo 獲取到edit改變前的數(shù)字
             String befour = data;
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void afterTextChanged(Editable editable) {
             // todo 獲取到edit改后的數(shù)字
             data = edtItem.getText().toString();
             String now = data ;
        }
      });

data是adapter傳給viewholder的數(shù)據(jù)。這樣寫的話在beforeTextChanged方法中獲取的就不是復(fù)用前item的數(shù)據(jù),而是當(dāng)前的數(shù)據(jù)。所以你滑動(dòng)時(shí)發(fā)現(xiàn)befour 和now 會(huì)是一樣,這時(shí)就不用進(jìn)行更改總數(shù)的操作,而手動(dòng)改變editText時(shí)befour 和now 是不一樣的。

總結(jié)

可能你看不懂我的需求和例子,說(shuō)明你沒碰到過(guò)這樣的情況(列表的edittext影響外部某個(gè)狀態(tài)),我也不太好解釋,但是你基本會(huì)碰到過(guò)數(shù)據(jù)錯(cuò)亂的情況,這就是我要說(shuō)的。

在RecyclerView中,不管你要做什么操作,不要直接對(duì)容器(ViewHolder)操作,而是對(duì)數(shù)據(jù)進(jìn)行操作。

補(bǔ)充一點(diǎn)java的常識(shí)

如果你傳的是對(duì)象的話,這里對(duì)形參的改變,實(shí)參也會(huì)變,但是傳基本數(shù)據(jù)類型的話,你變形參是不會(huì)影響實(shí)參的,所以不管有多少個(gè)數(shù)據(jù),在viewholder中最后應(yīng)該傳入對(duì)象而不是基本數(shù)據(jù)類型.

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實(shí)現(xiàn)粒子中心擴(kuò)散動(dòng)畫效果

    Android實(shí)現(xiàn)粒子中心擴(kuò)散動(dòng)畫效果

    粒子動(dòng)畫效果相比其他動(dòng)畫來(lái)說(shuō)是非常復(fù)雜了的,主要涉及三個(gè)方面,粒子初始化、粒子位移、粒子回收等問題,本篇將實(shí)現(xiàn)兩種動(dòng)畫效果,代碼基本相同,只是旋轉(zhuǎn)速度不一樣,需要的朋友可以參考下
    2024-02-02
  • Android 項(xiàng)目正式簽名打包教程分享

    Android 項(xiàng)目正式簽名打包教程分享

    這篇文章主要介紹了Android 項(xiàng)目正式簽名打包教程分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView

    Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView

    Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView替代TimePicker/NumberPicker/WheelView,很實(shí)用的一篇文章分享給大家,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android系統(tǒng)的五種數(shù)據(jù)存儲(chǔ)形式實(shí)例(一)

    Android系統(tǒng)的五種數(shù)據(jù)存儲(chǔ)形式實(shí)例(一)

    Android系統(tǒng)有五種數(shù)據(jù)存儲(chǔ)形式,分別是文件存儲(chǔ)、SP存儲(chǔ)、數(shù)據(jù)庫(kù)存儲(chǔ)、contentprovider 內(nèi)容提供者、網(wǎng)絡(luò)存儲(chǔ)。本篇文章詳解的介紹了每種數(shù)據(jù)存儲(chǔ)的用法,有興趣的可以了解一下。
    2016-12-12
  • Android仿正點(diǎn)鬧鐘時(shí)間齒輪滑動(dòng)效果

    Android仿正點(diǎn)鬧鐘時(shí)間齒輪滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android仿正點(diǎn)鬧鐘時(shí)間齒輪滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Android實(shí)現(xiàn)圖片預(yù)覽與保存功能

    Android實(shí)現(xiàn)圖片預(yù)覽與保存功能

    在App開發(fā)中,通常為了省流提高加載速度提升用戶體驗(yàn)我們通常在列表中或新聞中的插圖都是以縮略圖壓縮過(guò)的圖片來(lái)進(jìn)行展示,當(dāng)用戶點(diǎn)擊圖片時(shí)我們?cè)偃ゼ虞d真正像素的大圖讓用戶預(yù)覽。本文將利用Flutter實(shí)現(xiàn)這一功能,需要的可以參考一下
    2022-04-04
  • Android開發(fā)Compose remember原理解析

    Android開發(fā)Compose remember原理解析

    這篇文章主要為大家介紹了Android開發(fā)Compose remember原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Android自定義View接收輸入法輸入的內(nèi)容

    Android自定義View接收輸入法輸入的內(nèi)容

    最近的一個(gè)項(xiàng)目需要實(shí)現(xiàn)需求,希望從一個(gè)View上調(diào)用輸入法和接收輸入法傳過(guò)來(lái)的內(nèi)容,下面這篇文章就給大家分享下Android自定義View接收輸入法輸入的內(nèi)容的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Android入門之利用Spinner實(shí)現(xiàn)彈出選擇對(duì)話框

    Android入門之利用Spinner實(shí)現(xiàn)彈出選擇對(duì)話框

    這篇文章主要為大家詳細(xì)介紹了Android里如何巧用Spinner做彈出選擇對(duì)話框,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2022-11-11
  • 建造者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    建造者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來(lái)說(shuō)一般是兩項(xiàng)任務(wù),組建產(chǎn)品;返回組建好的產(chǎn)品
    2017-08-08

最新評(píng)論

元谋县| 本溪市| 民勤县| 大方县| 礼泉县| 凤庆县| 和政县| 阿尔山市| 湘潭县| 靖安县| 龙游县| 射阳县| 喀喇沁旗| 邮箱| 赤水市| 沐川县| 舒兰市| 南木林县| 谷城县| 涡阳县| 合作市| 成武县| 阿图什市| 东源县| 芷江| 理塘县| 玉田县| 莱西市| 张北县| 光山县| 山阳县| 阿鲁科尔沁旗| 澎湖县| 汝城县| 同德县| 文成县| 九龙县| 嘉义市| 固阳县| 登封市| 长垣县|