当我在Android上运行该应用程序时,仅正确显示ListView中的前几个项目,此后的每个项目都与列表中第一个显示的项目重复。这只是一个UI,不是逻辑问题,因为当我从列表中选择一个项目时,SelectedItem被设置为列表中的正确项目。
此外,颜色仅在第一张卡片上是正确的,其他卡片上的颜色不是对应项目的正确颜色。
该应用程序可以在UWP上完美运行,此问题仅在Android上存在。我的猜测是,它与ListView缓存策略(RetainElement,RecycleElement或RecycleElementAndDataTemplate)有关。我尝试制作自定义ListView控件并设置不同的缓存策略,但到目前为止还算不上运气。
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/performance
这是XAML中的ListView:
<ListView
SelectedItem="{Binding SelectedItem}"
ItemsSource="{Binding Cards}"
HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Margin="5, 2.5"
BackgroundColor="{Binding CardColor.Pale}">
<BoxView HeightRequest="10" BackgroundColor="{Binding CardColor.Bright}"/>
<StackLayout Padding="10, 2.5, 10, 10">
<Label Text="Date" FontSize="10"/>
<Label Text="{Binding Title}"/>
<Label Text="{Binding Text}"/>
</StackLayout>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Card.cs
public class Card : MvxNotifyPropertyChanged
{
private int _id;
private string _title;
private string _text;
private CardColor _cardColor;
public int Id { get => _id; set => SetProperty(ref _id, value); }
public string Title { get => _title; set => SetProperty(ref _title, value); }
public string Text { get => _text; set => SetProperty(ref _text, value); }
public CardColor CardColor { get => _cardColor; set => SetProperty(ref _cardColor, value); }
public Card(int id, string title, string text, CardColor cardColor)
{
Id = id;
Title = title;
Text = text;
CardColor = cardColor;
}
}
CardColor.cs
public class CardColor
{
public Color Bright { get; set; }
public Color Pale { get; set; }
public CardColor(Color bright, Color pale)
{
Bright = bright;
Pale = pale;
}
}