概述
最近在做项目遇到类似天猫中同一个订单中的多个商品评价问题,
其中涉及到EditText输入问题,其中一个Edittext输入改变之后,
其他item中的Edittext也跟着改变的bug,尝试了很多方法都没有解决。
网上查看了一篇类似的文章但是不能解决我的问题:
http://blog.csdn.net/shadowliucs/article/details/51329687
问题待解决
、、、、、、、、、、、、、、今天调试找到方法了、、、、、、、、、、、、、、、、
按照上面的文章是没有错的,只是我在回调给Activity的时候,
传的position传错了,用getTag()获取输入的第几个position,
导致会去修改其他item中Edittext的值
代码如下:
1.RecylistView方法onBindViewHolder中,原则就是setText前设置true;setText后设置false;
setText进入的时候会进入addTextChangedListener中的afterTextChanged方法,
保证只执行一次afterTextChanged里面的内容,重复执行就跳出if (!ischange) 判断,
直到下一次重新输入
ischange =true;
if (datas.get(position).getEvaluateStringLength()==null) {
((MyViewHolder)holder).tv_evaluate.setText("");
((MyViewHolder) holder).tv_evaluate_tips.setText("0/120");
}else{
((MyViewHolder)holder).tv_evaluate.setText(datas.get(position)
.getCommentContent());
((MyViewHolder)holder).tv_evaluate.setSelection(datas.get(position)
.getCommentContent().length());
((MyViewHolder) holder).tv_evaluate_tips.setText(datas.get(position)
.getEvaluateStringLength()+"/120");
}
ischange =false;
((MyViewHolder)holder).tv_evaluate.addTextChangedListener(new MyTextWatcher(((MyViewHolder)holder),position));
2.MyViewHolder方法,本来想在adapter内更新的,但是考虑到输入完成要
和图片一起上传, 就用回调传到主Activity中去拼接参数一起上传评论了。
还有就是要单独更新某个item,
全部更新的话会默认第一个获取第一个焦点。
class MyTextWatcher implements TextWatcher{
private CharSequence temp;
private boolean isEdit = true;
private int selectionStart ;
private int selectionEnd ;
private MyViewHolder holder;
int position;
public MyTextWatcher(MyViewHolder holder,int position){
this.holder=holder;
this.position=position;
}
@Override
public void beforeTextChanged(CharSequence s, int arg1, int arg2,
int arg3) {
temp = s;
}
@Override
public void onTextChanged(CharSequence s, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable s) {
if (!ischange) {
// holder.tv_evaluate.removeTextChangedListener(this);
selectionStart = ((MyViewHolder) holder).tv_evaluate
.getSelectionStart();
selectionEnd = ((MyViewHolder) holder).tv_evaluate
.getSelectionEnd();
// Log.i("gongbiao1",""+selectionStart);
if (temp.length() > 120) {
s.delete(selectionStart - 1, selectionEnd);
int tempSelection = selectionStart;
// tv_evaluate.setText(s);
// specialUpdate("120");
// datas.get(position).setEvaluateStringLength("120");
} else {
// datas.get(position).setEvaluateStringLength(String.valueOf
(s.toString().length()));
}
// ((MyViewHolder)holder).tv_evaluate.extendSelection(s.length());
// evaluateNum.EvaluateNum(s.toString().trim(),position);
if (s.toString().trim().equals("")) {
// return;
}
if (temp.length() > 120) {
// datas.get(position).setEvaluateStringLength("120");
} else {
// datas.get(position).setEvaluateStringLength(String.valueOf
(s.toString().length()));
}
// datas.get(position).setCommentContent(s.toString());
int indexposition=(Integer)((MyViewHolder)holder)
.itemView.getTag();
evaluateNum.EvaluateNum(s.toString(),indexposition );
// notifyItemChanged(position);
// holder.tv_evaluate.addTextChangedListener(this);
// return;
// specialUpdate(s.toString().trim(),position);
// holder.tv_evaluate.addTextChangedListener(this);
}
}
}
3.主Activity实现回调:
@Override
public void EvaluateNum(final String number, final int position) {
if (evaluateBeans==null)
return;
if (number.equals("")){
return;
}
// evaluateAdapter.upData(position);
// rv_evaluate_product.setAdapter(evaluateAdapter);
evaluateBeans.get(position).setCommentContent(number);
evaluateBeans.get(position).setEvaluateStringLength(
String.valueOf(number.trim().length()));
evaluateAdapter.notifyItemChanged(position);
// evaluateAdapter.upData(position);
}
最后
以上就是壮观大神为你收集整理的RecyclerView.Adapter的某个item中EditText的输入后所有列表中Editetext全部被修改的问题的全部内容,希望文章能够帮你解决RecyclerView.Adapter的某个item中EditText的输入后所有列表中Editetext全部被修改的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复