2016-07-08 4 views
0

Я пытаюсь реализовать RecyclerView с помощью CardView, карты - это просто изображения с текстом поверх него. Сначала все работает по назначению, но если вы, например, прокрутите вниз, а затем создадите резервную копию в recyclerView, тогда imageViews будет пустым, текстовые просмотры будут прекрасными.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.Position = 0; Кроме того, вы не знаете, что такое ваш поток, вы можете использовать MemoryStreams для кэширования изображения на уровне PCL или изображения кеша на уровне пользовательского интерфейса (путем сохранения результатов BitmapFactory.DecodeStreamAsync).

Смежные вопросы