Android 单击复选框更新列表项内容
我有一个自定义列表视图,左侧有一个复选框和4个文本视图,与astrid task manager非常相似。 我打算做的是,单击复选框时,文本视图必须更新其值。起初,我的问题是,在选中位置1的复选框时,会在滚动时选中末尾或其他地方的复选框。在寻找解决方案的过程中,我了解了listview中视图的循环利用。我应用了像viewholder这样的概念,现在我能够保持复选框的状态。但是,在复选框单击时,我更改了文本视图,并且更改不会持续,这意味着任何随机电视也会显示相同的更改Android 单击复选框更新列表项内容,android,android-listview,Android,Android Listview,我有一个自定义列表视图,左侧有一个复选框和4个文本视图,与astrid task manager非常相似。 我打算做的是,单击复选框时,文本视图必须更新其值。起初,我的问题是,在选中位置1的复选框时,会在滚动时选中末尾或其他地方的复选框。在寻找解决方案的过程中,我了解了listview中视图的循环利用。我应用了像viewholder这样的概念,现在我能够保持复选框的状态。但是,在复选框单击时,我更改了文本视图,并且更改不会持续,这意味着任何随机电视也会显示相同的更改 我已在适配器中应用了一个复
我已在适配器中应用了一个复选框onclicklistener。有什么想法可以实现吗?您希望将项目的状态保存在项目数据中,而不是保存在视图持有者中。视图持有者只是视图的一种便利,如果您循环使用视图,视图在不同的时间将显示许多不同的项目。在数据绑定期间,您需要绑定显示项目所需的所有状态,以避免随机数据出现在另一个列表项目的视图中
public class MyListAdapter extends BaseAdapter {
// ....
@Override
View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflate(R.layout.my_list_item_layout, parent, false);
// View holder just prevents having to look up these values
// every time the view is reused.
MyViewHolder holder = new MyViewHolder();
holder.checkbox = (CheckBox) view.findViewById(R.id.check_box);
holder.textview = (TextView) view.findViewById(R.id.text_view);
view.setTag(holder);
}
final MyViewHolder holder = (MyViewHolder) view.getTag();
final MyData data = (MyData) getItem(position);
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
data.savedCheckboxState = isChecked;
// now tell the view to rebind the data
notifyDataSetChanged();
}
});
holder.checkbox.setChecked(data.savedCheckboxState);
holder.textview.setText(String.valueOf(data.savedCheckboxState));
return view;
}
private static class MyViewHolder {
CheckBox checkbox;
TextView textview;
}
}
您可以在这里参考我的完整代码,您可以做的是,将复选框状态存储在布尔数组中,这样您就不会面临这个问题