1. 程式人生 > >通過實現TextWatcher介面來獲取RecyclerView item的EditText的值

通過實現TextWatcher介面來獲取RecyclerView item的EditText的值

我們在實際開發中,可能會遇到要在列表裡面放入一個EditText,但是我們在列表所在的介面獲取不到這個EditText的值,所以,這裡我們在Adapter裡面為EditText新增一個addTextChangedListener,並實現TextWatcher介面來進行監聽, 並在Adapter中建立一個介面,用於在列表所在的介面實現其方法獲取對應EditText的值,下面我們來看具體的實現過程。

首先是在Adapter裡面編寫,先新建一個介面

public interface SaveEditListener{
        void SavedEdit(int position,String string);
    }

然後新建一個類,先實現TextWatcher介面

class TextSwitcher implements TextWatcher{

        private MyViewHolder myViewHolder;

        public TextSwitcher(MyViewHolder myViewHolder) {
            this.myViewHolder = myViewHolder;
        }

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

        }

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

        }

        @Override
        public void afterTextChanged(Editable editable) {
            SaveEditListener listener = (SaveEditListener) context;
            if (editable!=null){
                listener.SavedEdit(Integer.parseInt(myViewHolder.edt_grade.getTag().toString()),editable.toString());
            }
        }
    }
這裡通過EditText所在的position作為標識,防止發生資料混亂,接著在onBindViewHolder裡面為EditText新增監聽器,並通過setTag方法將position記錄下來
holder.edt_grade.addTextChangedListener(new TextSwitcher(holder));
holder.edt_grade.setTag(position);

這樣,Adapter裡面的程式碼就寫完了,接下來就是在列表介面實現我們新建的那個介面,並通過map方式將資料put進去
@Override
    public void SavedEdit(int position, String string) {
        map.put(position,string);
    }
後面,想要得到對應 EditText的值就可以直接在map中取獲取。

所有的實現過程就這樣,還是很好理解,但是我在測試的時候發現了一個非常無解的bug,就是如果對應的列表很長的時候,我一條資料一條資料的向下面輸入,輸到後面會發現,最前面的三個資料會自動填充到最後面的三個EditText上面去,而最前面的三個EditText裡面沒有資料了,但是我把前面三個的資料重新填上之後提交,發現最後面的三個EditText獲取到的資料為空,而最前面那個三個的資料是我第一次填的資料,第二次重新填的那個資料沒有起作用,,,,甚是無語。。。。希望有大神可以指導一下,萬分感謝