在 ListView 中使用 CheckBox 时,可能会出现滚动时选择框错位的问题,这是由于 ListView 的视图回收和复用机制导致的。以下是解决 ListView 中 CheckBox 错位问题的一种常见方式:

使用状态保存机制:

为了正确保存 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