Xamarin表单:适配器的内容已更改,但ListView未收到通知

时间:2016-01-31 15:52:49

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

在我的Xamarin应用程序中,使用Xamarin Forms,我收到错误"适配器的内容已更改,但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制作的应用程序。

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

1 个答案:

答案 0 :(得分:3)

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

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

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