Xamarin.Forms ListПросмотреть дубликаты на Android - PullRequest
0 голосов
/ 10 февраля 2019

Когда я запускаю приложение на Android, правильно отображаются только первые несколько элементов в ListView, после чего каждый элемент является дубликатом одного из первых отображаемых элементов в списке.Это только пользовательский интерфейс, а не логическая проблема, потому что, когда я выбираю элемент из списка, SelectedItem устанавливается на правильный элемент из списка.

Кроме того, цвет правильный только на первой картецвета на других картах не являются правильными цветами для соответствующего элемента.

Приложение отлично работает на UWP, эта проблема только на Android. Я предполагаю, что в нем есть что-тоделать со стратегией кэширования ListView (RetainElement, RecycleElement или RecycleElementAndDataTemplate).Я пытался создать пользовательские элементы управления ListView и установить различные стратегии кэширования, но пока не повезло.

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

Android vs UWP

Это ListView в XAML:

<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;
    }
}
...