通過實現TextWatcher介面來獲取RecyclerView item的EditText的值
阿新 • • 發佈:2019-02-07
我們在實際開發中,可能會遇到要在列表裡面放入一個EditText,但是我們在列表所在的介面獲取不到這個EditText的值,所以,這裡我們在Adapter裡面為EditText新增一個addTextChangedListener,並實現TextWatcher介面來進行監聽, 並在Adapter中建立一個介面,用於在列表所在的介面實現其方法獲取對應EditText的值,下面我們來看具體的實現過程。
首先是在Adapter裡面編寫,先新建一個介面
public interface SaveEditListener{ void SavedEdit(int position,String string); }
然後新建一個類,先實現TextWatcher介面
這裡通過EditText所在的position作為標識,防止發生資料混亂,接著在onBindViewHolder裡面為EditText新增監聽器,並通過setTag方法將position記錄下來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()); } } }
holder.edt_grade.addTextChangedListener(new TextSwitcher(holder));
holder.edt_grade.setTag(position);
這樣,Adapter裡面的程式碼就寫完了,接下來就是在列表介面實現我們新建的那個介面,並通過map方式將資料put進去
後面,想要得到對應 EditText的值就可以直接在map中取獲取。@Override public void SavedEdit(int position, String string) { map.put(position,string); }
所有的實現過程就這樣,還是很好理解,但是我在測試的時候發現了一個非常無解的bug,就是如果對應的列表很長的時候,我一條資料一條資料的向下面輸入,輸到後面會發現,最前面的三個資料會自動填充到最後面的三個EditText上面去,而最前面的三個EditText裡面沒有資料了,但是我把前面三個的資料重新填上之後提交,發現最後面的三個EditText獲取到的資料為空,而最前面那個三個的資料是我第一次填的資料,第二次重新填的那個資料沒有起作用,,,,甚是無語。。。。希望有大神可以指導一下,萬分感謝