Xamarin Forms - перерисовка - PullRequest
       15

Xamarin Forms - перерисовка

0 голосов
/ 28 августа 2018

Я пишу приложение с использованием Xamarin Forms XAML, и мне нужен способ перерисовать представление.

У меня есть макет, содержащий несколько меток и ListView. У меня также есть кнопка, которая при нажатии вызывает API для загрузки нового набора данных, который должен обновить элементы управления на странице.

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

Иногда данные в моем ListView могут содержать только 1 или 2 строки, но обычно их будет намного больше. В первый раз, когда страница прорисована, все выглядит нормально, но моя проблема в том, чтобы обновить представление данными, имеющими различное количество строк в ListView, поскольку элементы управления не изменяют размер.

Пример:

При первом входе в экран я загружаю данные, и ListView имеет 10 элементов и поэтому рисует 10 строк на экране

Когда я нажимаю кнопку «Обновить данные», загруженные данные могут теперь содержать только 2 элемента. Данные обновляются корректно, но интервал на экране остается того же размера, что и при первом рисовании (с 10 элементами), поэтому у меня теперь большое пустое пространство.

Если сделано противоположное этому примеру (1-я запись - 2 элемента, 2-я запись - 10 элементов), то пространство для ListView по-прежнему будет всего 2 элемента в высоту, и поэтому вы можете видеть только 2 из 10 элементов.

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

1 Ответ

0 голосов
/ 28 августа 2018

Была такая же проблема. Я думаю, что вы подходите к этому неправильно. ListView не работает так, как вы думаете. Он не предназначен для того, чтобы всегда идеально соответствовать его содержанию. Если вы хотите этого, вам нужно рассчитать высоту самостоятельно и установить ее на ListView.

Один из подходов - изменить высоту вашего ListView. Вы можете добиться этого, привязав свойство к HeightRequest:

<ListView
  HeightRequest="{Binding ListViewHeight}">
</ListView>

Это мой расчет для ListViewHeight. RowHeight - 72 для Android и 75 для iOS. Это грязное решение из-за жестко закодированных значений высоты, но это лучшее решение, которое я нашел для этой проблемы. Помните, что вам необходимо настроить эти значения в соответствии с вашими потребностями, иначе ваш ListView может быть слишком маленьким / высоким.

public double ListViewHeight
{
    get
    {
        if (MyItemsList!= null)
        {
            double listViewHeight = MyItemsList.Count * RowHeight;
            if (CanLoadMoreNotifications)
            {
                listViewHeight += RowHeight;
            }
            return listViewHeight;
        }
        return 0;
    }
}

Теперь каждый раз, когда вы вносите изменения в свой список, звоните RaisePropertyChanged("ListViewHeight");. Таким образом, ваш ListView рост вычисляется и ваш пользовательский интерфейс обновляется.

...