Xamarin - 列表视图图像单元格图像在滚动时消失

时间:2017-05-05 09:55:45

标签: android xamarin xamarin.android xamarin.forms android-contacts

我在Xamarin安卓应用程序中使用ImageCell显示所有电话簿联系人的列表。

列表显示联系人图像,联系人姓名和联系电话。所有信息都正确显示,但只要我向下滚动,所有联系人图像都会消失,除非我重新运行应用程序,否则永远不会重新加载。

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

Map<String, Object> combinedMap =restTemplatemap.getForObject("http://dataurl);

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

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;

P.S。我没有使用任何类型的pf组件或包。

1 个答案:

答案 0 :(得分:0)

我有同样的问题。要解决此问题,我必须将Stream转换为字节数组,然后从该新的字节数组返回到流。

这是我的代码

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

您可以在此问题中了解有关从流创建字节数组的更多信息 Creating a byte array from a stream