我试图用RecyclerView实现CardView,卡片只是图像视图,上面有文本视图。起初,一切都按预期工作,但是如果您向下滚动,然后在recyclerView中备份,那么imageViews将是空的,文本视图就可以了。
给出了发生的事情

适配器:
public class NewsCardAdapter : RecyclerView.Adapter
{
private List<RSSItem> items;
public NewsCardAdapter()
{
HasStableIds = true;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
var view = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.NewsItem, parent, false);
NewsViewHolder viewHolder = new NewsViewHolder(view);
return viewHolder;
}
public override long GetItemId(int position)
{
return items[position].Id;
}
public override async void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
{
var item = items[position];
var holder = viewHolder as NewsViewHolder;
if (item.ThumbNail != null)
{
holder.ImgThumbnail.SetImageBitmap(await BitmapFactory.DecodeStreamAsync(item.ThumbNail));
}
else
{
// Place holder in case item doesn't have thumbnail
holder.ImgThumbnail.SetImageResource(Resource.Drawable.Icon);
}
holder.Title.Text = item.Title;
}
public override int ItemCount => items.Count;
public List<RSSItem> Items
{
get { return items; }
set { items = value; }
}
}
public class NewsViewHolder : RecyclerView.ViewHolder
{
private ImageView imgThumbnail;
private TextView title;
public NewsViewHolder(View itemView) : base(itemView)
{
imgThumbnail = itemView.FindViewById<ImageView>(Resource.Id.img_thumbnail);
title = itemView.FindViewById<TextView>(Resource.Id.news_title);
}
public ImageView ImgThumbnail
{
get { return imgThumbnail; }
set { imgThumbnail = value; }
}
public TextView Title
{
get { return title; }
set { title = value; }
}
}模型(RSSItem):
public class RSSItem : INotifyPropertyChanged
{
[PrimaryKey, AutoIncrement]
public long Id { get; set; }
public string Title { get; set; }
private Stream thumbnail;
[Ignore]
public Stream ThumbNail
{
get { return thumbnail; }
set
{
thumbnail = value;
OnPropertyChanged();
}
}
// ...
}我的猜测--这与将imageView源代码分配给从流解码的位图有关,而不是将位图本身存储在模型中。但是,我不能这样做,因为System.Drawable不是PCL的一部分。
发布于 2016-07-08 10:47:04
我建议您使用毕加索库检索图像。它更有表现力(主要是在记忆中),并且会解决你的问题。
发布于 2016-07-08 11:45:39
尝试将流定位为在解码之前启动,比如Stream.Position = 0;而且,不确定您的流是什么,您可以使用MemoryStreams在PCL级别缓存图像,或者在UI级别缓存图像(通过存储BitmapFactory.DecodeStreamAsync结果)。
https://stackoverflow.com/questions/38264134
复制相似问题