【发布时间】:2018-06-02 12:37:15
【问题描述】:
我正在创建一个 android 应用程序,我在其中使用 recyclerView 并且 recyclerView 的行具有 editText。
这是我的ReadingAdapter 课程
public class ReadingAdapter extends RecyclerView.Adapter<ReadingAdapter.ViewHolder> implements AdapterView.OnItemSelectedListener {
Context context;
String valOpenReading, valClosReading, valConsumption;
private List<ReadingData> readingList;
static String[] arrValOpenRead, arrValClosRead, arrValConsumption;
public ReadingAdapter(Context context, List<ReadingData> readingList) {
this.context = context;
this.readingList = readingList;
arrValOpenRead = new String[readingList.size()];
arrValClosRead = new String[readingList.size()];
arrValConsumption = new String[readingList.size()];
}
@Override
public ReadingAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.reading_sheet_layout, parent, false);
return new ReadingAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(final ReadingAdapter.ViewHolder holder, final int position) {
ReadingData tempData = readingList.get(position);
holder.pdtName.setText(tempData.pdtName);
holder.keyId.setText("Key "+tempData.keyId);
holder.etClosRead.addTextChangedListener(new TextWatcher() {
boolean ignore = false;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (ignore)
return;
ignore = true;
valOpenReading = holder.etOpenRead.getText().toString();
arrValOpenRead[position] = valOpenReading;
valClosReading = s.toString().equals("") ? "0": s.toString();
arrValClosRead[position] = valClosReading;
if (!valOpenReading.equals("")) {
if (Integer.parseInt(valClosReading) < Integer.parseInt(valOpenReading)) {
Toast.makeText(context, "Check once! closing reading should be more than opening reading!", Toast.LENGTH_LONG).show();
valConsumption = "0";
holder.consumption.setText("");
} else {
valConsumption = (Integer.parseInt(valClosReading) - Integer.parseInt(valOpenReading))+"";
arrValConsumption[position] = valConsumption;
holder.consumption.setText(valConsumption);
}
} else
Toast.makeText(context, "Please fill the opening reading!", Toast.LENGTH_SHORT).show();
ignore = false;
}
});
}
@Override
public int getItemCount() {
return readingList.size();
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView pdtName, keyId, consumption;
EditText etOpenRead, etClosRead;
public ViewHolder(View view) {
super(view);
pdtName = (TextView)view.findViewById(R.id.txt_list_pdt_supp);
keyId = (TextView)view.findViewById(R.id.key_set);
etOpenRead = (EditText)view.findViewById(R.id.open_val_set);
etClosRead = (EditText)view.findViewById(R.id.clos_val_set);
consumption = (TextView)view.findViewById(R.id.consumption_val);
}
}
}
这是我的ReadingData.java
public class ReadingData {
String pdtName, keyId, openReading, closReading, consumption;
public ReadingData(String pdtName, String keyId) {
this.pdtName = pdtName;
this.keyId = keyId;
}
}
在这里,如果我在 recyclerView 的起始项目中输入值,那么当我将项目向上滚动到列表底部时,最后一个项目将具有该值。
请忽略图像质量,因为我们无法上传超过 2MiB 的快照。
这里视图在列表滚动时被回收。如何防止将值复制到列表中的其他项目。
而且Toast 也重复了好几次。如何阻止这种情况。
更新:
通过LQ Gioan 到SO question How ListView's recycling mechanism works 的建议,我得到了ListView 实际如何与视图回收一起工作的逻辑。
但我不确定recyclerView 是否也同样有效。
但在我的情况下,我该如何实现这个过程。请有人在这里帮助我。
【问题讨论】:
-
ListView重用屏幕上不可见的项目视图。你应该看看这个答案来理解:stackoverflow.com/questions/11945563/…。要解决您的问题,您应该将用户留下的数据保存在ReadingData中。每次调用getView方法时,您将这些数据设置回EditText(s) -
感谢您的链接。现在我明白了
listView的工作原理。但是我应该在我的情况下使用什么?我怎样才能在不回收视图的情况下实现这一目标?我应该在这里使用recyclerView吗? -
如果你想在不回收的情况下使用
ListView,那么你在你的代码中删除if (convertView == null)。但是,如果您的列表中有很多项目,您可以获得OutOfMemoryException。所以我强烈推荐你在ListView中使用回收。您可以在我的第一条评论中尝试我的解决方案 -
ReadingData仅用于绑定变量。对此感到抱歉,但我不明白解决方案。你能解释一下吗? -
您可以将
TextWatcher用于EditText(s) 来观看用户使用EditText.addTextChangedListener(TextWatcher)(example here) 输入的任何内容。然后,将新变量添加到ReadingData(或创建一个新对象-> 由您决定)以保留这些输入数据。任何时候调用getView方法,您都可以将这些输入数据设置回 EditText(s)。
标签: android android-recyclerview addtextchangedlistener