您的位置:首页 > 其它

通过实现TextWatcher接口来获取RecyclerView item的EditText的值

2017-06-05 10:16 477 查看
我们在实际开发中,可能会遇到要在列表里面放入一个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获取到的数据为空,而最前面那个三个的数据是我第一次填的数据,第二次重新填的那个数据没有起作用,,,,甚是无语。。。。希望有大神可以指导一下,万分感谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: