【发布时间】:2016-10-06 05:07:00
【问题描述】:
我正在尝试创建一个listview,每行都有一个checkbox 和edittext。我已使用 notifyDatasetChanged() 在 checkbox 检查事件上启用了 edittext。
但它会重置位置,这使得跟踪当前位置变得困难。我创建了一个实例变量来跟踪 checkbox 选中事件的当前位置,但这也重置为最后一个选中的项目。
checkbox 工作正常。它在选中时启用edittext,在取消选中时禁用,选中状态也很好。但问题是edittext 如果我使用listposition,则只能获得最后检查的值,如果我使用position,则last item。
我的适配器如下:
public class ListViewAdapter extends ArrayAdapter<Model> implements TextWatcher{
private final List<Model> list;
private final Context context;
private int listPosition;
private ViewHolder newHolder = null;
public ListViewAdapter(Context context, List<Model> list) {
super(context, R.layout.row, list);
this.context = context;
this.list = list;
}
public static class ViewHolder {
public CheckBox mCheckBox;
public EditText mEditText;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflator = LayoutInflater.from(context);
convertView = inflator.inflate(R.layout.row, null);
newHolder = new ViewHolder();
newHolder.mCheckBox = (CheckBox) convertView.findViewById(R.id.checkbox);
newHolder.mEditText = (EditText) convertView.findViewById(R.id.txtValue);
newHolder.mCheckBox.setText(list.get(position).getCheckText());
newHolder.mEditText.setText(list.get(position).getValue());
setEdit(false);
convertView.setTag(newHolder);
convertView.setTag(R.id.checkbox, newHolder.mCheckBox);
convertView.setTag(R.id.txtValue, newHolder.mEditText);
} else {
newHolder = (ViewHolder) convertView.getTag();
}
newHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
int getPosition = (int) compoundButton.getTag();
list.get(getPosition).setSelected(compoundButton.isChecked());
list.get(getPosition).setEnabled(compoundButton.isChecked());
setEdit(compoundButton.isChecked());
listPosition = getPosition;
if(!compoundButton.isChecked()){
list.get(getPosition).setValue("");
}
notifyDataSetChanged();
}
});
newHolder.mCheckBox.setTag(position);
newHolder.mEditText.setTag(position);
newHolder.mEditText.addTextChangedListener(this);
setEdit(list.get(position).isEnabled());
return convertView;
}
public void setEdit(boolean bool){
newHolder.mEditText.setEnabled(bool);
newHolder.mEditText.setFocusableInTouchMode(bool);
newHolder.mEditText.setCursorVisible(bool);
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
@Override
public void afterTextChanged(Editable s) {
list.get(listPosition).setValue(s.toString());
}
}
【问题讨论】:
-
我不确定您为什么需要设置标签并获取列表中的位置。
getView方法有一个当前行的位置参数。此外,notifyDatasetChanged仅在您在该位置编辑Model时才需要调用,所以也许您应该这样做,并以此为基础绘制视图 -
查看这里以解决如何获取您的项目的位置mysamplecode.com/2012/07/android-listview-checkbox-example.html
-
@cricket_007 我需要调用
notifyDatasetChanged来启用/禁用EditText。一旦我们调用notifyDatasetChanged,getView方法中给出的位置参数将重置为last position。我之前尝试过使用它,但它没有用。如果我检查一个项目并在相应的EditText中输入文本,当前代码也可以正常工作,但如果任何用户在非当前行中输入文本,则会失败。 -
可能是因为
afterTextChanged仅使用最后一个选中复选框的行,并且仅更新该模型。您可能还想在那里调用 notifyDatasetChanged
标签: android listview checkbox android-edittext android-checkbox