【问题标题】:Xamarin Forms: The content of the adapter has changed but ListView did not receive a notificationXamarin Forms:适配器的内容已更改,但 ListView 未收到通知
【发布时间】:2016-02-01 01:59:49
【问题描述】:

在我使用 Xamarin Forms 制作的 Xamarin 应用程序中,我收到错误消息“适配器的内容已更改,但 ListView 未收到通知。请确保您的适配器的内容未从后台线程修改,但仅来自 UI 线程。”。

我正在使用 Xamarin.Forms ListView 来显示学生列表。当我转到添加学生页面并将学生添加到列表中时,会引发此错误。

ListView listView = new ListView
        {
            ItemsSource = register.StudentList,
            ItemTemplate = cell // Set the ImageCell to the item template for the listview
        };

        // Set the content for the page.
        Content = new StackLayout
        {
            Children = { header, listView }
        };

上面的代码来自注册页面,这里是显示学生列表的地方。下面的代码来自 AddStudent 页面,这是将学生添加到寄存器的地方。

//Now add the new student to the register.
            if(register != null)
            {

                register.addStudent(Student);

            }               

            //After adding to the register, open up the page for this register.
            Navigation.InsertPageBefore(new RegisterPage(register), Navigation.NavigationStack.First());
            await Navigation.PopToRootAsync();

我实际上并没有在代码中使用适配器,所以我不确定这个错误来自哪里。我见过的很多类似问题似乎都与 android 适配器有关,但这是一个用 Xamarin Forms 制作的应用程序。

在这种情况下是否可以使用某种替代方法?

【问题讨论】:

  • StudentList 的类型是什么?它是 ObservableCollection 吗?
  • 它只是一个学生类型的列表。 Student 对象保存学生的姓名、ID 等数据。

标签: android listview xamarin xamarin.forms android-adapter


【解决方案1】:

正如您提到的,您的 register 对象是 List。因此,您将其绑定到的视图将永远不会收到有关内容更改的消息。

所以 Jason 在 cmets 中问,register 是否是 ObservableCollection,你为什么要问自己。 ObservableCollection 实现了INotifyCollectionChanged,这意味着当绑定到视图时,视图现在可以订阅接口提供的事件。这个事件可以告诉它发生了什么变化。这可能是添加了一个新项目。集合中的某个项目已被移除或顺序已更改。

反过来,如果您想更新集合中的某个项目,它们还必须实现 INotifyPropertyChanged 以使视图反映所做的更改。

【讨论】:

  • 好的,通过让视图订阅事件,它将能够看到发生了什么变化。我已经查看了一些示例,但找不到适合我情况的任何内容。你知道是否有任何关于如何实现这一点的好例子吗?谢谢
  • 只需将 List 替换为 ObservableCollection。 XF 的数据绑定机制会自动为您处理所有事情。
  • @Jason 哇,非常简单!这正是需要的。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多