[英]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.