我一直在网上寻找可能的答案。我找到了一个,但它会在滚动时不断更改其值。我不知道我的代码的哪一部分使它发生变化。我的定制ListView
中有一个EditText
和TextView
。 TextView
将保存数据库中的学生列表,EditText
用户将输入相应学生的分数。这是我的代码
public class RecordAdapter extends ArrayAdapter<String>{
private final Context context;
private final String[] values;
String value;
public RecordAdapter(Context context, String[] values) {
super(context, R.layout.row1, values);
this.context = context;
this.values = values;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
value = "0";
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row1, null);
holder.scoreEditText = (EditText) convertView.findViewById(R.id.scores);
holder.nameTextView = (TextView)convertView.findViewById(R.id.name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.nameTextView.setText(value);
holder.nameTextView.setText(values[position]);
holder.scoreEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
value = holder.scoreEditText.getText().toString();
value = s.toString();
}
});
return convertView;
}
static class ViewHolder{
public TextView nameTextView;
public EditText scoreEditText;
}
}
请帮忙。非常感谢。
每次更新一行时,都会调用getView()
。并且您使用 value = "0"
将文本设置回 0,因此不会应用 afterTextChanged
中字符串值的更新。修复了将字符串文本调用为全局的声明,例如:String value = "0"
适配器类中,并从getView()
方法中删除value = "0"
。
除此之外,
- 删除
value = s.toString();
- 将
value = holder.scoreEditText.getText().toString();
移至onTextChanged(..)
-
将以下内容添加到适配器类:
public int getViewTypeCount() { return getCount(); }
public int getItemViewType(int position) { return position; }
不建议将 EditText 放在 listView 中,因为它会导致 listView 本身发生变化(因为键盘)。
相反,您应该使用简单的 TextView,如果您希望在其中编辑某些内容,请使用带有它的对话框或允许您编辑值的新活动。
无论如何,如果您仍然希望在 listView 中使用 EditText,您应该在每次更改其文本时保存它保存的数据(请注意,对于"afterTextChanged",您没有将数据保存到"values"变量中),并在 getView 上恢复它。
您还应该考虑使用"onTextChanged"而不是"afterTextChanged"