首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Droid RecyclerView只显示一次图像

Xamarin.Droid RecyclerView只显示一次图像
EN

Stack Overflow用户
提问于 2016-07-08 10:12:53
回答 2查看 212关注 0票数 0

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

给出了发生的事情

适配器:

代码语言:javascript
复制
    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):

代码语言:javascript
复制
 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的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-08 10:47:04

我建议您使用毕加索库检索图像。它更有表现力(主要是在记忆中),并且会解决你的问题。

票数 0
EN

Stack Overflow用户

发布于 2016-07-08 11:45:39

尝试将流定位为在解码之前启动,比如Stream.Position = 0;而且,不确定您的流是什么,您可以使用MemoryStreams在PCL级别缓存图像,或者在UI级别缓存图像(通过存储BitmapFactory.DecodeStreamAsync结果)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38264134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档