2016-07-08 47 views
0

我想實現與CardView的RecyclerView,卡片只是在它上面的textview imageviews。起初,一切都按預期工作,但如果您向下滾動,然後在recyclerView中備份,則imageView將爲空,textviews正常。Xamarin.Droid RecyclerView只顯示圖像一次

GIF發生什麼

gif of what happens

適配器:

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源代碼ap從流中解碼並且不在模型中存儲位圖本身。但是我不能這樣做,因爲System.Drawable不是PCL的一部分。

+0

@jzeferino實施畢加索實際上解決了它,謝謝! –

+0

請標記我的回答是正確的。我把它添加到下面。 – jzeferino

回答

0

我建議你使用Picasso庫來檢索圖像。它的性能更高(主要在內存中),並會解決您的問題。

1

嘗試定位Stream以在解碼之前開始,如Stream.Position = 0; 此外,不知道你的流是什麼,你可以使用MemoryStreams在PCL級緩存圖像,或在UI級緩存圖像(通過存儲BitmapFactory.DecodeStreamAsync結果)。