Xamarin-滚动时,ListView Image Cell图像消失了



我正在使用我的Xamarin Android应用程序中的Imagecell显示所有电话簿联系人的列表。

列表显示联系图像,联系人名称和联系电话。所有信息都正确显示,但是一旦我向下滚动,所有的触点图像就会消失,除非我重新运行应用程序。

以下是获得所有联系人的代码:

var contactList = new List < ContactsModel > ();
var ContactDetailURI = ContactsContract.Contacts.ContentUri;
string[] ContactDetailProjection = {
    ContactsContract.Contacts.InterfaceConsts.DisplayName,
    ContactsContract.Contacts.InterfaceConsts.PhotoId,
    //ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
};
var ContactDetailCursor = Forms.Context.ContentResolver.Query(ContactDetailURI, ContactDetailProjection, null, null, null);
if (ContactDetailCursor.MoveToFirst()) {
    do {
        var imageURI = Android.Net.Uri.Parse(new System.Uri(ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[1]))).ToString());
        var stream = Android.App.Application.Context.ContentResolver.OpenInputStream(imageURI);
        var imageSource = Xamarin.Forms.ImageSource.FromStream(() => stream);
        var contact = new ContactsModel();
        contact.DisplayName = ContactDetailCursor.GetString(ContactDetailCursor.GetColumnIndex(ContactDetailProjection[0]));
        contact.PhotoId = imageSource;
        contactList.Add(contact);
    } while (ContactDetailCursor.MoveToNext());
}
return contactList;

下面是页面的XAML代码,它将显示所有联系人:

<ContentPage.Content>
    <ListView x:Name="ContactList">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell
                    Text="{Binding DisplayName}"
                    Detail="{Binding PhoneNumber}"
                    ImageSource="{Binding PhotoId}">
                </ImageCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage.Content>

P.S。我不使用任何类型的PF组件或软件包。

我也有同样的问题。为了解决这个问题,我必须将流转换为字节数组,然后从该新字节数组返回流。

这是我的代码

Stream stream = Android.App.Application.Context.ContentResolver.OpenInputStream(PhotoUri);
byte[] imageBytes = ReadFully(stream);
contact.Photo = Xamarin.Forms.ImageSource.FromStream(() => new MemoryStream(imageBytes));
public static byte[] ReadFully(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }

您可以在此问题中阅读有关从流中创建字节数组的更多信息从流中创建字节数组

最新更新