2015-12-29 32 views
9

ile kullanırken Picasso görüntü yanlış konumlandırma sorunu Uygulamamda, bir web servisinden getirilen makaleleri gösteriyorum. Bu makaleler başlık, resim ve diğer alanlara sahiptir. Görüntüleri görüntülemek için Picasso kullanıyorum.RecyclerView

Sorun - RecyclerView öğesini kaydırırken, görüntülerin yanlış yerleştirildiğini görüyorum. Bazı öğeler çift görüntülere sahip. Xml madde düzenini yeniden kullanan RecyclerView olduğunu biliyorum ve bunun nedeni bir sorun yaratıyor. Ama bence bu soruna bir çözüm olmalı. Ben bu konuda googled ve stackoverflow üzerinde bazı mesajlar buldum ama bu yardımcı olmadı. Herhangi bir yardım mutluluk duyacağız

<ImageView 
        android:id="@+id/img_image" 
        android:layout_width="match_parent" 
        android:layout_height="@dimen/cardview_image_thumbnail_height" 
        android:layout_alignParentStart="true" 
        android:layout_alignParentLeft="true" 
        android:scaleType="centerCrop" 
        android:layout_margin="@dimen/cardview_padding_btw_widgets" 
        android:src="@drawable/noimage" 
        /> 

benim düzen dosyasının Part - örnek-

Picasso loads pictures to the wrong imageview in a list adapter

için aşağıdaki fakat aynı problem

public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.ArticleViewHolder> { 

    protected Activity mActivity; 
    protected List<Article> mItems = new ArrayList<>(); 
    private static OnEntityClickCallback mCallback; 

    public ArticleAdapter(Activity pActivity) { 
     mActivity = pActivity; 
    } 

    public void setItemClickCallback(OnEntityClickCallback pCallback) { 
     this.mCallback = pCallback; 
    } 

    @Override 
public ArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View articleView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_article_item, parent, false); 
    return new ArticleViewHolder(articleView); 
} 

    public void addItem(List<Article> moreItems) { 
     mItems.addAll(moreItems); 
     notifyDataSetChanged(); 
    } 

    public void removeItems(){ 
     mItems.clear(); 
     notifyDataSetChanged(); 
    } 


    @Override 
    public void onBindViewHolder(ArticleViewHolder holder, int position) { 
     holder.bind(mItems.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return mItems.size(); 
    } 


    static class ArticleViewHolder extends RecyclerView.ViewHolder { 

     private TextView tvTitle; 
     TextView tvAuthor; 
     TextView tvPostdate; 
     ImageView imgImage; 
     RatingBar ratingBar; 

     public ArticleViewHolder(View view) { 
      super(view); 
      this.tvTitle = (TextView) view.findViewById(R.id.tv_title); 
      this.tvAuthor = (TextView) view.findViewById(R.id.tv_author); 
      this.tvPostdate = (TextView) view.findViewById(R.id.tv_date); 
      this.imgImage = (ImageView) view.findViewById(R.id.img_image); 
      this.ratingBar = (RatingBar) view.findViewById(R.id.ratingBar); 
     } 

     public void bind(final Article article) { 

     tvTitle.setText(article.getTitle()); 
     tvPostdate.setText(article.getPostdate()); 
     tvAuthor.setText(article.getAuthor()); 

     // Canceling the older request 
     Picasso.with(imgImage.getContext()).cancelRequest(imgImage); 
     // Creating a new request. 
     if (article.getImage() != null) { 
       Picasso.with(imgImage.getContext()).load(article.getImageUrl()) 
       .placeholder(R.drawable.noimage) 
       .error(R.drawable.noimage) 
       .into(imgImage); 
     } 

    this.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (mCallback != null) 
       mCallback.onEntitySelected(article); 
     } 
    }); 
} 

    } 
} 

Güncelleme sahip denedim . Teşekkür ederim.

+0

Sadece resimler gibi null ise bir yedeği sağlayabilir? – Soham

+0

@Soham Sadece görüntüler yanlış yerleştiriliyor. –

+0

Adaptör sınıfınızı gönderir misiniz? – Soham

cevap

6

Çizilebilir olanı dışsal olarak ayarlayın, çünkü ona zaten takılı bazı çekilebilir görüntü görüntüsü elde edersiniz. ImageView yeniden oluşturulmuyor, böylece ImageView'daki önceki görüntü siz kaldırılıncaya kadar görünür olacak.

if (article.getImage() != null) { 
      Picasso.with(imgImage.getContext()).load(article.getImageUrl()) 
        .placeholder(R.drawable.noimage) 
        .error(R.drawable.noimage) 
        .into(imgImage); 
    }else{ 
//   imgImage.setImageDrawable(null); 
     imgImage.setImageDrawable(R.drawable.some_drawable); 
    } 
+1

Burada herhangi bir değişiklik görmüyorum. –

+1

'u ayrıntılı olarak inceleyebilir misiniz? { imgImage.setImageDrawable (null); }. actuly ne oluyor? imageview'iniz geri dönüştürülüyor ve görüntüyü son kez yapıyor. Dolayısıyla, imageUrl boşsa, bu resim görünümündeki herhangi bir çizilebilir hediyeyi kaldırmalısınız. Bunun işe yarayıp yaramadığını söyle –

+0

Tamam. Ama xml düzeninde varsayılan bir görüntü yaşıyorum. Görüntü URL'si boşsa o resmin görüntülenmesini istiyorum. Bu durumda –

0

Kullanım setTag onBindViewHolder o veriyi yapacak ve görüntüleri şaşırmaz olmayacaktır. Belki yaklaşım deneyin

@Override 
    public void onBindViewHolder(ArticleViewHolder holder, int position) { 
     holder.bind(mItems.get(position)); 
     holder.imgImage.setTag(mItems.get(position)); 
    } 

VEYA

belki görünümünüz yeniden kullanılır

@Override 
    public void onBindViewHolder(ArticleViewHolder holder, int position) { 
     holder.bind.setTag(mItems.get(position)); 
    } 
0

çalışır.

ImageView'unuzun mevcut isteklerini iptal etmek için Picasso.with(imgImage.getContext()).cancelRequest(imgImage); numaralı telefonu arayın.

Sonra article.getImage() != null eğer resim yüklemek ve makale görüntü yanlış yerleştirilmiş ya da metinler vardır imgImage.setImageDrawable(R.drawable.some_drawable);