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

Xamarin ListView数据源有2条却仅显示1条 蓝牙读取后UI不自动更新

问题根因
  • 你当前使用的List<T>未实现INotifyCollectionChanged接口,集合元素变更时无法主动通知UI刷新,你每次手动重设ItemsSource的做法效率低且无法保证生效时机
  • 蓝牙读取的回调事件大概率运行在后台线程,后台线程直接修改UI绑定的数据源不会触发即时刷新,只有等下一次UI渲染触发(比如你点击屏幕)才会更新
修复步骤
  1. 将集合类型替换为ObservableCollection<T>,该类型原生支持集合变更通知,修改元素后会自动通知UI刷新
    修改声明代码:
    // 替换原来的List声明
    private ObservableCollection<JsonDict> itemsList = new ObservableCollection<JsonDict>();
    
  2. 所有操作UI绑定数据源的逻辑都放到主线程执行,避免跨线程更新UI的问题,修改EventRead方法如下:
    private void EventRead(object sender, EventArgs e)
    {
        Console.WriteLine("READ READ");
        try
        {
            Itron.Mobile.Radio.Communication.SRead.HandledEventArgs<ChoiceConnectEndpoint> item = (Itron.Mobile.Radio.Communication.SRead.HandledEventArgs<ChoiceConnectEndpoint>)e;
            JsonDict jsonDict = new JsonDict();
            jsonDict.RadioNumber = item.Data.EndpointId.ToString();
            jsonDict.MeterType = item.Data.MarketType.ToString();
            jsonDict.Read = ((Endpoint100G)item.Data).Reading.Read.ToString();
            jsonDict.ModuleType = item.Data.EndpointTypeName;
            jsonDict.ServiceType = item.Data.MarketType.ToString();
            
            // 切换到UI线程操作集合
            Device.BeginInvokeOnMainThread(() => 
            {
                itemsList.Add(jsonDict);
                Console.WriteLine("Count:" + itemsList.Count);
                // 无需再重设ItemsSource,ObservableCollection会自动触发UI更新
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error:" + ex.Message);
        }
    }
    
  3. 移除所有重复给listView.ItemsSource赋值的冗余代码,初始化时赋值一次即可。
额外优化建议

你当前ReadAnyNear方法中调用imrRadioService.ReadAny后立刻隐藏了加载弹窗,实际上ReadAny是异步方法,建议等待_readAnyComplete任务执行完成后再隐藏弹窗,避免加载状态和实际执行进度不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:45:08