1. 程式人生 > >Recyclerview item中有EditText使用重新整理遇到的坑!!!!!

Recyclerview item中有EditText使用重新整理遇到的坑!!!!!

由於工作專案的需要要對商品購買之後新增評價的功能,於是自己仿淘寶的評價的效果圖作為自己專案中的評價效果圖.但是在開發中遇到了一個大坑,就是在動態新增照片之後,重新整理介面卡的時候.item中的EditText中的文字發生了錯亂的現象.最後bug發現由於如下程式碼產生的原因.

/**
 * 這是一個EditText的文字監聽,因為在activity中要獲取文字內容,所以設定了這個監聽.
 * 於是,果斷開啟debug模式,最終確認確實是TextWatcher的問題,由於呼叫了notifyDataSetChanged()方法,而導致EditText重繪,
 * 並且每次都走了textWatcher的afterTextChanged()方法.導致EditText中的內容發生了錯亂的現象.
 *
 */
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);

最後在網上找了很久才知道是Recyclerview條目複用的時候導致監聽事件的重繪,所以只需要去掉Recyclerview的複用就可以完美的解決這個問題餓.但是我們又知道Recyclerview是自帶複用的怎麼去除複用呢? 只需要在onBindViewHolder(EvaluateHolder holder, int position)中新增如下的的程式碼就可強制的停用Recyclerview的複用,兩種解決方案
第一種就是強制的停用Recyclerview的複用:

  holder.setIsRecyclable(false);

第二種通過view的setTag()方法解決Recyclerview的複用程式碼如下:

  holder.mEtEvaluate.setTag(position);//繫結tag標記
        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儲存

                }
            }
        };
        holder.mEtEvaluate.addTextChangedListener(watcher);
        holder.mEtEvaluate.setText(mEvaluateProductMap.get((holder.mEtEvaluate.getTag())).getBuyerEvaluate()); //通過控制元件的tag標記獲取值,設定到控制元件上

這兩種方法都能解決問題,只是方法一隻適合條目較少的情況,如果你的條目較多就不太適用了希望我踩的坑能給你有所幫助,大家一起進步謝謝!!!!