You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android C#自定义ListView中点击项控制CheckBox选中问题

问题原因分析

你现在的问题核心在于用了一个全局静态变量Class1.bl来控制所有列表项的CheckBox状态,这完全违背了ListView的设计逻辑:

  • 静态变量是全局共享的,所有列表项都会读取同一个值。当你点击France把bl设为false后,在GetView里又立刻把它改回true,后续其他项的GetView执行时,bl已经回到true,自然无法勾选。
  • ListView的Item是会复用的,每个Item的状态应该和对应的数据源绑定,而不是用一个全局变量来统一控制。
解决方案

我们需要把勾选状态和每个TableList实体绑定,通过数据源来控制CheckBox的状态,具体步骤如下:

1. 修改实体类,添加勾选状态属性

给TableList类增加一个IsChecked属性,用来存储对应项的勾选状态:

public class TableList
{
    public string Name { get; set; }
    public bool IsChecked { get; set; } // 新增:存储当前项的勾选状态

    public TableList(string name)
    {
        Name = name;
        IsChecked = false; // 默认不勾选
    }
}

2. 修改ListView的ItemClick事件逻辑

点击Item时,找到对应的TableList对象,切换它的IsChecked状态,然后通知适配器刷新界面:

listView.ItemClick += delegate (object sender, AdapterView.ItemClickEventArgs e) {
    // 获取点击位置对应的实体对象
    var selectedItem = list[e.Position];
    // 切换勾选状态(如果需要点击一次勾选、再点击取消,就用!selectedItem.IsChecked;如果只需要勾选,就设为true)
    selectedItem.IsChecked = !selectedItem.IsChecked;
    // 通知适配器刷新,让界面同步状态
    ((ListAdapter)listView.Adapter).NotifyDataSetChanged();
};

3. 修改ListAdapter的GetView方法

现在直接从当前Item的IsChecked属性读取状态,不再依赖全局静态变量:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    var item = items[position];
    View view = convertView;
    if (view == null) 
        view = context.LayoutInflater.Inflate(Resource.Layout.CoinList, null);

    // 设置文本和图片
    view.FindViewById<TextView>(Resource.Id.CoinName).Text = item.Name;
    view.FindViewById<ImageView>(Resource.Id.imageView1).SetImageResource(Resource.Drawable.n);
    
    // 根据实体的IsChecked属性设置CheckBox状态
    var checkBox = view.FindViewById<CheckBox>(Resource.Id.checkBox1);
    checkBox.Tag = position; // 设置Tag,用于后续CheckBox点击事件定位
    checkBox.Checked = item.IsChecked;

    // 可选:绑定CheckBox点击事件,同步实体状态
    checkBox.Click -= CheckBox_Click; // 先移除避免重复绑定
    checkBox.Click += CheckBox_Click;

    return view;
}

// CheckBox点击时同步实体的状态
private void CheckBox_Click(object sender, EventArgs e)
{
    var checkBox = (CheckBox)sender;
    var position = (int)checkBox.Tag;
    var item = items[position];
    item.IsChecked = checkBox.Checked;
}
补充:为什么之前的代码只对France有效?

因为你在点击France时把Class1.bl设为false,此时刚好France对应的GetView执行,会把CheckBox设为Checked,然后立刻把bl改回true。而其他项的GetView执行时,bl已经是true,所以CheckBox会设为Unchecked,自然无法勾选。

内容的提问来源于stack exchange,提问作者Wassim01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:37:50