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
相关产品推荐
相关产品推荐

