ListView中的ImageView在启用了RecycleElement的情况下简要显示滚动的上一个图像

时间:2016-02-02 16:07:21

标签: ios xamarin xamarin.forms

我有以下课程的列表:

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的情况下阻止此类行为?

2 个答案:

答案 0 :(得分:3)

我没有尝试过此操作,但在ViewCell您可以加入DisappearingAppearing个事件。

您可能希望查看在Disappearing事件处理程序上发布图像源,但有时这可能会在以后的某个时间发生,我想从回忆中,所以您可能还想尝试在{{1上发布图像希望在屏幕上显示之前执行的事件处理程序?

答案 1 :(得分:3)

我们已经通过手动将Image源设置为null来强制渲染新图像来解决这个问题。我们通过使用ListView的OnBindingContextChanged事件来实现这一点。希望这会有所帮助。

已编辑(已添加以下代码):

我们有这样的事情:

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