使用状态保存机制:
为了正确保存 CheckBox 的选中状态,您需要在数据源中保存每个 CheckBox 的状态。这样,在 getView 方法中重新绑定数据时,您可以使用保存的状态来正确设置 CheckBox 的选中状态。
示例:
1. 创建数据模型类:
public class ListItem {
private String title;
private boolean isChecked;
public ListItem(String title) {
this.title = title;
this.isChecked = false; // 默认未选中
}
public String getTitle() {
return title;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
}
2. 在适配器中使用状态保存机制:
public class CustomAdapter extends BaseAdapter {
private Context context;
private List<ListItem> dataList;
public CustomAdapter(Context context, List<ListItem> dataList) {
this.context = context;
this.dataList = dataList;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item_layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.titleTextView = convertView.findViewById(R.id.titleTextView);
viewHolder.checkBox = convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
ListItem listItem = (ListItem) getItem(position);
viewHolder.titleTextView.setText(listItem.getTitle());
viewHolder.checkBox.setChecked(listItem.isChecked());
// 设置CheckBox的点击事件
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 更新数据源中CheckBox的状态
dataList.get(position).setChecked(((CheckBox) v).isChecked());
}
});
return convertView;
}
static class ViewHolder {
TextView titleTextView;
CheckBox checkBox;
}
}
在上述示例中,通过在 ListItem 类中添加 isChecked 属性,可以保存每个 CheckBox 的状态。在 getView 方法中,根据数据源中的状态设置每个 CheckBox 的选中状态。通过监听 CheckBox 的点击事件,更新数据源中的状态,从而解决了滚动时 CheckBox 错位的问题。
请注意,确保在适配器中正确处理数据源的变化,例如在 getView 中设置数据时,避免直接更改数据源而不通知适配器。在数据源变化后,通过调用适配器的 notifyDataSetChanged() 方法来通知 ListView 刷新。
转载请注明出处:http://www.pingtaimeng.com/article/detail/15144/Android