gpt4 book ai didi

android - Xamarin - ListView 图像单元格图像在滚动时消失

转载 作者:行者123 更新时间:2023-11-30 00:33:37 25 4
gpt4 key购买 nike

我在我的 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>

附言我没有使用任何类型的 pf 组件或包。

最佳答案

我遇到了同样的问题。为解决此问题,我必须将 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

关于android - Xamarin - ListView 图像单元格图像在滚动时消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com