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

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赋值了新的列表实例,就会看不到之前的修改。

  • 关键要点与修复建议:

    1. 确保实例一致性:检查其他方法是否使用了同一个checkedList实例,如果其他方法里重新执行了类似checkedList = sensorDisplayList.Where(...).ToList()的代码,会覆盖掉你修改过的实例,导致更新丢失。要避免重复创建新的列表实例。
    2. 同步原始数据源:如果需要让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();
      };
      
    3. 冗余代码优化:SetUp里的configureAdapter.NotifyDataSetChanged()可以省略,因为刚给listView.Adapter赋值时,ListView会自动刷新数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:10:32