ListView UI更新后checkedList未同步?原因咨询
问题
我为ListView实现了自定义ConfigureAdapter,该Adapter在OnCreate调用的SetUp方法中,于用户点击AlertDialog的“Select”按钮后初始化。相关代码如下:
private List<Sensor> checkedList; private ConfigureAdapter configureAdapter; private ListView listView; protected override void OnCreate(Bundle savedInstanceState) { listView = FindViewById<ListView>(Resource.Id.sensorList); listView.ItemClick += ListView_ItemClick; SetUp(); }
private void SetUp() { ... aircraftView.SetPositiveButton("Select", delegate { checkedList = sensorDisplayList.Where(o => o.Checked == true).ToList(); configureAdapter = new ConfigureAdapter(this, checkedList); { listView.Adapter = configureAdapter; configureAdapter.NotifyDataSetChanged(); }; }); }
当点击ListView项时,会弹出PopupMenu;选择菜单项后,我会更新ListView数据以反映该操作:
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e) { if (checkedList != null) { Sensor sensor = checkedList[e.Position]; PopupMenu menu = new PopupMenu(this, listView.GetChildAt(e.Position)); if (mTirePositionList == null) { DisplayError("Error."); } else { ... menu.MenuItemClick += (s1, arg1) => { sensor.WheelPosition = arg1.Item.ToString(); checkedList[e.Position].WheelPosition = arg1.Item.ToString(); configureAdapter.NotifyDataSetChanged(); }; menu.Show(); } } }
此时ListView UI已成功更新,但在该事件外的其他方法中引用checkedList时,列表并未体现上述修改。请问这是为什么?我忽略了什么要点?
原因与解决方案
核心原因:你在
SetUp方法中给checkedList赋值的是sensorDisplayList.Where(...)返回的新列表实例,如果其他方法引用的是原始的sensorDisplayList,或者在其他地方重新给checkedList赋值了新的列表实例,就会看不到之前的修改。关键要点与修复建议:
- 确保实例一致性:检查其他方法是否使用了同一个
checkedList实例,如果其他方法里重新执行了类似checkedList = sensorDisplayList.Where(...).ToList()的代码,会覆盖掉你修改过的实例,导致更新丢失。要避免重复创建新的列表实例。 - 同步原始数据源:如果需要让
sensorDisplayList也同步更新(其他方法可能依赖这个原始列表),修改WheelPosition时要同时更新原始列表中对应的对象。因为checkedList里的Sensor是引用类型,修改属性会同步到原始对象,示例代码如下:menu.MenuItemClick += (s1, arg1) => { string newPosition = arg1.Item.ToString(); // 修改checkedList中的对象 sensor.WheelPosition = newPosition; checkedList[e.Position].WheelPosition = newPosition; // 同步更新原始数据源sensorDisplayList var originalSensor = sensorDisplayList.FirstOrDefault(s => s.Id == sensor.Id); if (originalSensor != null) { originalSensor.WheelPosition = newPosition; } configureAdapter.NotifyDataSetChanged(); }; - 冗余代码优化:
SetUp里的configureAdapter.NotifyDataSetChanged()可以省略,因为刚给listView.Adapter赋值时,ListView会自动刷新数据。
- 确保实例一致性:检查其他方法是否使用了同一个
内容的提问来源于stack exchange,提问作者appym243
相关产品推荐
相关产品推荐

