Xamarin Listview 仅添加 1 项我的列表中有 2 项

Posted

技术标签:

【中文标题】Xamarin Listview 仅添加 1 项我的列表中有 2 项【英文标题】:Xamarin Listview only adding 1 item my List has 2 items on it 【发布时间】:2021-12-19 19:20:21 【问题描述】:

我有一个 listview 和一个通过 Bluethoot 连接将项目获取到 Radio 设备的方法,当方法结束时,我的 itemsList 中有两个项目,但我的 ListView 上只显示一个,该项目在我之前不可见出于某种原因点击屏幕。

关于如何在 ListView 中同时显示我的两个项目有任何帮助吗?

我认为这与我处理 EventRead 和 EventStopped 的方式有关,也许它没有时间更新

public partial class ReadAnyPage : ContentPage
    
        IRadioPlatform _platform;
        DropdownTypes dropdownTypes;

        Task<List<ChoiceConnectEndpoint>> _readAnyComplete;
        public event EventHandler OnStopped;
        public event EventHandler<Itron.Mobile.Radio.Communication.SRead.HandledEventArgs<ChoiceConnectEndpoint>> readEndpoints;
        private List<JsonDict> itemsList = new List<JsonDict>();
        string bleName, blePort;

        public ReadAnyPage()
        
            InitializeComponent();
            BindingContext = this; //Added this

            _platform = DependencyService.Get<IRadioPlatform>();

            dropdownTypes = new DropdownTypes();

            bleName = Preferences.Get("ble_name", "");
            blePort = Preferences.Get("ble_port", "");

            CancellationTokenSource tokenSource = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;

            listView.ItemsSource = itemsList;

            ReadAnyNear(tokenSource, token);
        

        private void ReadAnyNear(CancellationTokenSource tokenSource, CancellationToken token)
        
            var loading = UserDialogs.Instance.Loading("Reading Endpoints...", onCancel: tokenSource.Cancel, "\n\n" + Resx.Resources.Cancel, true, MaskType.Black);

            try
            
                // Set new IMR
                IMRRadioservice imrRadioService = new IMRRadioService(_platform);

                imrRadioService.Name = bleName;
                imrRadioService.Port = blePort;string

                readEndpoints += EventRead;
                OnStopped += EventStopped;

                _readAnyComplete = imrRadioService.ReadAny(token, readEndpoints, OnStopped);

            
            catch (Exception ex)
            
                DisplayAlert("Error", dropdownTypes.OnConvertErrorEX(ex.Message), "ok", "cancel");

            

            loading.Hide();
        

        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();

                itemsList.Add(jsonDict);
                Console.WriteLine("Count:" + itemsList.Count);
                listView.ItemsSource = itemsList;
            
            catch (Exception ex)
            
                Console.WriteLine("Error:" + ex.Message);
            
        

        private void EventStopped(object sender, EventArgs e)
        
            Console.WriteLine("STOPPED");
        

        private async void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
        
            
        

        private void ListView_Refreshing(object sender, EventArgs e)
        
            OnRefreshDevicesList();
        

        private void OnRefreshDevicesList()
        
            
            listView.EndRefresh();
        
    

【问题讨论】:

itemsList 应该是 ObservableCollection&lt;T&gt;,而不是 List&lt;T&gt; 并且不要重新分配ItemsSource 感谢@Jason 做到了,如此简单但我看不到它 【参考方案1】:

感谢@Jason 从这里解决

private List<JsonDict> itemsList = new List<JsonDict>();

到这里

private ObservableCollection<JsonDict> itemsList = new ObservableCollection<JsonDict>();

【讨论】:

考虑将其标记为答案,因为它对其他人有帮助。

以上是关于Xamarin Listview 仅添加 1 项我的列表中有 2 项的主要内容,如果未能解决你的问题,请参考以下文章

使用 LinearLayout 向 ListView 添加标题,Listview 被推离屏幕(Xamarin Android)

在运行时将带有绑定的控件添加到 Xamarin ListView?

用于 Xamarin.Forms 的带有标头 (LongListSelector) 的 ListView

如何使用 xamarin 从 SQLite 自动分配 ID 在 ListView 上添加 ItemTapped

Xamarin 将 ListView 项动态更新到 GUI

Xamarin MVVM 从另一个页面删除 Listview 项目