Xamarin.Forms CollectionView Просмотреть проблемы утилизации - PullRequest
0 голосов
/ 22 января 2020

Поэтому я использую CollectionView для отображения списка сущностей, которые при нажатии переключаются между открытым и закрытым состоянием. Я сделал это, анимировав параметр HeightRequest родительского контейнера представления, который был нажат, а затем добавив все представления, которые я хотел показать в расширенном состоянии представления. Вот фрагмент кода для этого:

var animate = new Animation(d => this.HeightRequest = d,
    this.Bounds.Height, this.Bounds.Height + 300, Easing.CubicOut);
animate.Commit(this, "a", length: 500);

this.layout.Children.Add(this.candidateList);
this.layout.Children.Add(this.openButton);

Это прекрасно работает, однако, если я прокручиваю список вниз, я вижу, что есть представления, которые также раскрываются, хотя я их ранее не трогал, более поэтому каждую полную страницу прокручиваю позже. Некоторые даже включают представления, которые я добавил в расширенное состояние, показывая неправильные данные. Я предположил, что это связано с механикой утилизации работы CollectionView, чтобы сэкономить на затратах на рендеринг, но должен быть какой-то способ исправить это. Вот код для соответствующих представлений:

var officesList = new CollectionView
{
    ItemTemplate = new DataTemplate(typeof(OfficeListView)),
    HorizontalOptions = LayoutOptions.FillAndExpand,
    ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
        SnapPointsType = SnapPointsType.None,
        ItemSpacing = 10,
    },
    Margin = new Thickness(20, 5),
    ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
    Footer = " ",
    FooterTemplate = new DataTemplate(() =>
    {
        return new StackLayout
        {
            Margin = new Thickness(20, 10),
            Children = {
                new LocorumLabels.MediumLabel
                {
                    Text = "x Results | No filters applied" //TODO: Bind these to footer
                }
            }
        };
    })


};

Следующий фрагмент - это CollectionsView в расширенном «Офисе»:

this.candidateList = new CollectionView
{
    ItemTemplate = new DataTemplate(typeof(CandidateDetailView)),
    HorizontalOptions = LayoutOptions.FillAndExpand,
    ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
        SnapPointsType = SnapPointsType.None,
        //ItemSpacing = 10,
    },
    Margin = new Thickness(10, 5),
    ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
    Footer = " ",
    HeightRequest = 300

};

А вот видео, показывающее, что происходит: https://youtu.be/Ltg2o8BwfwY

Надеюсь, кто-нибудь может сообщить мне о решении. Большое спасибо.

1 Ответ

1 голос
/ 22 января 2020

Вы правы.

Поскольку CollectionView использует DataTemplate, вам необходимо настроить свои представления и данные таким образом, чтобы при повторном использовании представление выглядело так, как должно.

Неочевидная часть для поддержания анимации в рабочем состоянии - это вызвать анимацию как сейчас, но когда она завершится, чтобы установить значение в данных, которое изменит представление от состояния до анимации к состоянию после анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...