ImageView в ListView вкратце показывает предыдущее изображение на прокрутке с включенным RecycleElement
У меня есть список следующего класса:
public class Set {
public string IconUrl { get; set; }
}
Этот список связан с ListView:
<ListView ItemsSource="{Binding Sets}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<Image Source="{Binding IconUrl}" />
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Когда просмотр загружается и пользователь начинает прокрутку, ячейки повторно используются, и изображение кратковременно отображает предыдущее изображение до того, как будет загружено и отображено новое изображение.
Есть ли способ предотвратить такое поведение без отключения RecycleElement?
Ответы
Ответ 1
Я не пробовал это, но на ViewCell
у вас есть события Disappearing
и Appearing
, в которые вы можете подключиться.
Возможно, вам захочется посмотреть источник изображения в обработчике событий Disappearing
, но иногда это может произойти когда-нибудь позже. Я думаю, что из воспоминаний, поэтому вы также можете попробовать снять изображение в обработчике событий Appearing
что, надеюсь, будет выполнено до отображения на экране?
Ответ 2
Мы решили это, вручную установив для источника изображения значение null, чтобы заставить визуализацию новых изображений. мы достигаем этого, используя OnBindingContextChanged событие ListView. Надеюсь, это поможет.
Отредактировано (добавлен код ниже):
У нас есть что-то вроде этого:
public class PeopleCell : ViewCell
{...
Image profileImage;
public PeopleCell()
{
profileImage = new Image
{
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
BackgroundColor = Color.FromHex("f5f5f5"),
Source = ImageSource.FromFile("profile_blankimage"),
};...
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
people = BindingContext as CustomerViewModel;
if(people.Customer.Avatar != null)
profileImage.Source = ImageSource.FromUri(new Uri(people.Customer.Avatar.Url));