我有一个 RecyclerView
,它由 TextView
和 EditText
组成,对于 TextView
RecyclerView
对我来说工作得很好,但是对于 EditText
,如果我在第一个单元格中输入值并继续输入其他单元格并滚动上面输入的值将不存在。
public class Assesment_MarkcardAdapter extends RecyclerView.Adapter<Assesment_MarkcardAdapter.ContactViewHolder> {
private String[] mDataset;
public Assesment_MarkcardAdapter(String[] myDataset)
{
mDataset = myDataset;
}
private List<Assesment_cardinfo> contactList;
private static String LOG_TAG = "Assesment_MarkcardAdapter";
public Assesment_MarkcardAdapter(List<Assesment_cardinfo> contactList) {
this.contactList = contactList;
}
@Override
public int getItemCount() {
return contactList.size();
}
@Override
public void onBindViewHolder(ContactViewHolder contactViewHolder, int i)
{
mDataset = new String[contactList.size()];
Assesment_cardinfo ci = contactList.get(i);
contactViewHolder.studentname.setText(ci.getStudentname());
contactViewHolder.studentid.setText(ci.getStudentid());
contactViewHolder.grade.setText(ci.getGrade());
contactViewHolder.improvement.setText(ci.getImprovements());
contactViewHolder.grade.setTag(ci);
contactViewHolder.improvement.setTag(ci);
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
//contactViewHolder.grade.setText(mDataset[i]);
}
@Override
public Assesment_MarkcardAdapter.ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.assesment_markcard, viewGroup, false);
return new ContactViewHolder(itemView , new MyCustomEditTextListener(),new MyCustomEditTextListener2());
}
public static class ContactViewHolder extends RecyclerView.ViewHolder {
public MyCustomEditTextListener myCustomEditTextListener;
public MyCustomEditTextListener2 myCustomEditTextListener2;
protected TextView studentname;
protected TextView studentid;
protected EditText grade;
protected EditText improvement;
public ContactViewHolder(View v, MyCustomEditTextListener myCustomEditTextListener, MyCustomEditTextListener2 myCustomEditTextListener2 ) {
super(v);
studentname = (TextView) v.findViewById(R.id.txt_student_name);
studentid = (TextView) v.findViewById(R.id.txt_student_id);
grade = (EditText) v.findViewById(R.id.edtxt_grade);
this.myCustomEditTextListener = myCustomEditTextListener;
grade.addTextChangedListener(myCustomEditTextListener);
improvement = (EditText) v.findViewById(R.id.edtxt_improvement);
this.myCustomEditTextListener2 = myCustomEditTextListener2;
improvement.addTextChangedListener(myCustomEditTextListener2);
}
}
private class MyCustomEditTextListener implements TextWatcher
{
private int position;
public void updatePosition(int position)
{
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
// no op
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
contactList.get(position).setGrade(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
// no op
}
}
private class MyCustomEditTextListener2 implements TextWatcher
{
private int position;
public void updatePosition2(int position)
{
this.position = position;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
// no op
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3)
{
contactList.get(position).setImprovements(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
// no op
}
}
public List<Assesment_cardinfo> getStudentLists()
{
return contactList;
}
}
最佳答案
在你的 onBindViewHolder()
中添加这两行
contactViewHolder.grade.setText(ci.getGrade());
contactViewHolder.improvement.setText(ci.getImprovement());
在设置监听器之后,也就是在
contactViewHolder.myCustomEditTextListener.updatePosition(i);
contactViewHolder.myCustomEditTextListener2.updatePosition2(i);
这两行代码。
这肯定会起作用。发生这种情况是因为您没有为 EditText 设置文本,并且在回收后,文本已经消失了。所以,试试这个,它肯定会起作用。
关于java - Android RecyclerView的EditText在输入数据向下滚动后交换位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34062984/