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));