通过实现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获取到的数据为空,而最前面那个三个的数据是我第一次填的数据,第二次重新填的那个数据没有起作用,,,,甚是无语。。。。希望有大神可以指导一下,万分感谢


你可能感兴趣的:(通过实现TextWatcher接口来获取RecyclerView item的EditText的值)