我在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组件或包。
答案 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