2016-07-08 3 views
0

CardView를 사용하여 RecyclerView를 구현하려고하는데 카드는 텍스트 뷰가있는 이미지 뷰일뿐입니다. 처음에는 모든 것이 의도대로 작동하지만 예를 들어 아래로 스크롤 한 다음 recyclerView에서 백업하면 imageViews가 비어 있습니다. 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(); 
     } 
    } 
    // ... 
} 

내 생각 엔 - 그것은 할당 함께 할 수있는 뭔가가 이미지 뷰 소스를 bitm으로 스트림에서 디코딩되고 모델에 비트 맵 자체를 저장하지 않습니다. 그러나 System.Drawable은 PCL의 일부가 아니기 때문에 그렇게 할 수 없습니다.

+0

@jzeferino 피카소를 구현하면 실제로 해결되었습니다. 감사합니다. –

+0

정확한 답으로 표시해주십시오. 나는 그것을 울부 짖었다. – jzeferino

답변

0

Picasso 라이브러리를 사용하여 이미지를 검색하는 것이 좋습니다. 그것의 더 performant (주로 기억에) 그리고 당신의 문제를 화나게 할 것입니다.

1

스트림을 디코딩하기 전에 Stream.Position = 0처럼 위치 시키십시오. 또한 스트림이 무엇인지 확실하지 않으면 MemoryStreams를 사용하여 PCL 수준의 이미지를 캐시하거나 UI 수준에서 이미지를 캐시 할 수 있습니다 (BitmapFactory.DecodeStreamAsync 결과 저장).