简体   繁体   English

RecyclerView中的EditText项目在滚动时会丢失内容

[英]EditText items in RecyclerView lose content when scrolling

In my activity there's a RecyclerView and a button to add items to the RecyclerView. 在我的活动中,有一个RecyclerView和一个将项目添加到RecyclerView的按钮。 Each item has two EditTexts. 每个项目都有两个EditText。
Here's a Screenshot 这是截图
When i scroll down and up, the EditTexts get empty. 当我上下滚动时,EditTexts为空。 and sometimes the value entered in the EditText changes it's position! 有时在EditText中输入的值会更改其位置! How can i solve this problem? 我怎么解决这个问题?
Here are the codes: 以下是代码:
Adapter : 适配器:

public class VoltageAdapter extends RecyclerView.Adapter<VoltageAdapter.DataViewHolder> {
    private List<Voltage> datas = new ArrayList<>();

    public List<Voltage> getDatas() {
        return datas;
    }

    @Override
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.item_voltage, parent, false);
        return new DataViewHolder(view);
    }

    @Override
    public void onBindViewHolder(DataViewHolder holder, int position) {
        holder.bindData(datas.get(position));
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    public static class DataViewHolder extends RecyclerView.ViewHolder {
        private EditText vOnEditText;
        private EditText vOffEditText;

        public DataViewHolder(View itemView) {
            super(itemView);
            vOnEditText = itemView.findViewById(R.id.et_ItemVoltage_Von);
            vOffEditText = itemView.findViewById(R.id.et_ItemVoltage_Voff);

        }

        public void bindData(final Voltage voltage) {
            vOnEditText.setText(voltage.getVon());
            vOffEditText.setText(voltage.getVoff());

            vOnEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    voltage.setVon(s.toString());
                }

                @Override
                public void afterTextChanged(Editable s) {
                    vOnEditText.setSelection(vOnEditText.getText().length());
                }
            });
            vOffEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    voltage.setVoff(s.toString());
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });
        }
    }

    public void addData(Voltage voltage) {
        datas.add(voltage);
        notifyItemInserted(datas.size() - 1);
    }
}

Activity Class : 活动类别:

public class VoltageActivity extends AppCompatActivity {
    private VoltageAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_voltage);
        setupViews();
    }

    private void setupViews() {
        Button calcucalteButton = findViewById(R.id.btn_voltage_calculate);
        Button addDataButton = findViewById(R.id.btn_voltage_addData);

        adapter = new VoltageAdapter();
        RecyclerView recyclerView = findViewById(R.id.rv_voltage_voltages);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(adapter);

        addDataButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Voltage voltage = new Voltage();
                adapter.addData(voltage);
            }
        });

        calcucalteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                List<Voltage> datas = adapter.getDatas();
                float DeltaVoltages[] = new float[datas.size()];
                for (int i = 0; i < datas.size(); i++) {
                    Voltage voltage = datas.get(i);
                    float res = Float.parseFloat(voltage.getVon()) - Float.parseFloat(voltage.getVoff());
                    DeltaVoltages[i] = res;
                }

                float minDelta = DeltaVoltages[0];
                for (int i = 0; i < DeltaVoltages.length; i++) {
                    if (DeltaVoltages[i] < minDelta) minDelta = DeltaVoltages[i];
                }
                Log.i("VoltageActivity", Arrays.toString(DeltaVoltages));
                Log.i("Min is ", String.valueOf(minDelta));
                Toast.makeText(VoltageActivity.this, "Min Delta V is " + String.valueOf(minDelta), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

your adapter should be like this : 您的适配器应如下所示:

public class VoltageAdapter extends RecyclerView.Adapter<VoltageAdapter.ViewHolder> {
    private final Context context;
    private final BorderSelectedListener borderSelectedListener;

    public VoltageAdapter(Context context, BorderSelectedListener borderSelectedListener) {
        this.context = context;
        this.borderSelectedListener = borderSelectedListener;
    }

    @NonNull
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(LayoutInflater.from(this.context).inflate(R.layout.overlay_adapter_item, parent, false));
    }

    public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("RecyclerView") int position) {


        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                borderSelectedListener.onBorderSelected(holder.getAdapterPosition());

            }
        });

        holder.vOnEditText.setText(getDatas().get(position).getVon());
        holder.vOffEditText.setText(getDatas().get(position).getVoff());

    }

    public int getItemCount() {

        return datas.size();

    }

    public interface BorderSelectedListener {
        void onBorderSelected(int position);
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        private EditText vOnEditText;
        private EditText vOffEditText;


        ViewHolder(View itemView) {
            super(itemView);
            vOnEditText = itemView.findViewById(R.id.et_ItemVoltage_Von);
            vOffEditText = itemView.findViewById(R.id.et_ItemVoltage_Voff);
        }
    }
}

It is correct behavior, because RecyclerView reuses items when scroll. 这是正确的行为,因为RecyclerView在滚动时会重用项目。 You can use this library to restore state - RendererRecyclerViewAdapter , see the ViewState wiki page. 您可以使用此库来还原状态-RendererRecyclerViewAdapter ,请参见ViewState Wiki页面。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM