中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RecyclerView中如何監聽EditText變化的BUG

發布時間:2021-07-12 14:05:00 來源:億速云 閱讀:162 作者:小新 欄目:移動開發

小編給大家分享一下RecyclerView中如何監聽EditText變化的BUG,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

需求:有一個列表,列表中有一個edittext(只能輸整形),外部有一個整形變量Int,每次改變列表中其中一項的edittext的值時,外部的Int都會改變。

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

但是這樣也引出了一個問題,就是今天要說的BUG

我要講的BUG是RecyclerView導致數據錯亂的問題

我要講的BUG是RecyclerView導致數據錯亂的問題

我要講的BUG是RecyclerView導致數據錯亂的問題

重要事情說三遍

你想想,對于addTextChangedListener這個方法,你每次對edittext進行setText操作后都會調用這個方法,不巧的是recyclerview是復用容器,數據超出可用的容器時,會對edittext進行復用,也就是說,我們本身只想在addTextChangedListener中去監聽手動改變edittext的情況,而recyclerview重復調用setText也會導致默認調用addTextChangedListener而會產生嚴重的數據錯亂。

舉個栗子,對我的需求原本是做這樣的操作。

edtItem.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
             // todo 獲取到edit改變前的數字
             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改后的數字
             String now = edtItem.getText().toString();
        }
      });

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

這邏輯看是完美,但是recyclerview幫你settext時,你的befour就是復用前的item中的數,而now就是新settext上去的數。
簡單來說,我們要的效果是手動修改editText時才進行int - befour + now步驟,而現在你光滑動就莫名其妙進行int - 復用前item的數 + 復用后item的數。

那我們就需要解決一個問題,只有手動修改edittext時,才進行正確的操作,滑動時,不進行操作
其實我以前有說過reyclerview不能直接對它的容器進行操作(也就是viewholder),而應該對它的數據進行操作。所以這里我們改成這樣的話,就不會受到滑動更新數據的影響。

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

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

        }

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

data是adapter傳給viewholder的數據。這樣寫的話在beforeTextChanged方法中獲取的就不是復用前item的數據,而是當前的數據。所以你滑動時發現befour 和now 會是一樣,這時就不用進行更改總數的操作,而手動改變editText時befour 和now 是不一樣的。

總結

可能你看不懂我的需求和例子,說明你沒碰到過這樣的情況(列表的edittext影響外部某個狀態),我也不太好解釋,但是你基本會碰到過數據錯亂的情況,這就是我要說的。

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

補充一點java的常識

如果你傳的是對象的話,這里對形參的改變,實參也會變,但是傳基本數據類型的話,你變形參是不會影響實參的,所以不管有多少個數據,在viewholder中最后應該傳入對象而不是基本數據類型.

以上是“RecyclerView中如何監聽EditText變化的BUG”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌苏市| 金门县| 大连市| 汶川县| 昌宁县| 米脂县| 枝江市| 浦江县| 青铜峡市| 阿坝县| 靖江市| 宁夏| 武乡县| 阿鲁科尔沁旗| 五大连池市| 凤翔县| 瑞安市| 双流县| 台中市| 太和县| 来宾市| 澎湖县| 论坛| 茂名市| 纳雍县| 巩留县| 和田市| 岗巴县| 攀枝花市| 韶关市| 营山县| 兴山县| 铜山县| 涿鹿县| 开远市| 陆河县| 通榆县| 密山市| 达尔| 峡江县| 洪洞县|