Xamarin.Forms ListView在Android上重复的项目

时间:2019-02-09 21:58:15

标签: android listview xamarin xamarin.forms listviewitem

当我在Android上运行该应用程序时,仅正确显示ListView中的前几个项目,此后的每个项目都与列表中第一个显示的项目重复。这只是一个UI,不是逻辑问题,因为当我从列表中选择一个项目时,SelectedItem被设置为列表中的正确项目。

此外,颜色仅在第一张卡片上是正确的,其他卡片上的颜色不是对应项目的正确颜色。

该应用程序可以在UWP上完美运行,此问题仅在Android上存在。我的猜测是,它与ListView缓存策略(RetainElement,RecycleElement或RecycleElementAndDataTemplate)有关。我尝试制作自定义ListView控件并设置不同的缓存策略,但到目前为止还算不上运气。

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/performance

Android vs UWP

这是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;
    }
}

0 个答案:

没有答案