java - Android RecyclerView的EditText在输入数据向下滚动后交换位置

标签 java android android-edittext android-recyclerview

我有一个 RecyclerView,它由 TextViewEditText 组成,对于 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/

相关文章:

java - 分析 - 如何获取删除的用户数量百分比或数量

android - 如何运行我用 Red 编写的 Android 应用程序?

Android 编辑文本 : How to apply Foreground color span as you type?

android - 在 webview 中显示重音字符

java - 如何找到默认的 JMX 端口号?

java - 使用货币代码解析(本地化)价格的正确方法?

java - JTable 列 modelIndex 与 viewIndex

java - 自动装箱对原始包装器 ArrayList 的性能影响

输入路径中的 Android ffmpeg 空白导致 "no such file or directory"

android - 当EditText设置为不可见android时,软键盘不显示