2015-12-29 12 views
9

私のアプリでは、Webサービスから取得された記事を表示しています。それらの記事は、タイトル、画像、および他のフィールドを有する。画像を表示するにはPicassoを使用しています。RecyclerViewで使用したときのピカソ画像の置き忘れの問題

問題 - RecyclerViewをスクロールしているうちに、イメージが間違って表示されています。一部のアイテムに重複した画像があります。私はRecyclerViewであることを知っています。これはxmlアイテムのレイアウトを再利用しているため、問題が発生しています。しかし、私はこの問題に対するいくつかの解決策が必要だと思います。私はこれについてgoogledし、stackoverflowのいくつかの記事を見つけたが、それは役に立たなかった。任意の助けをいただければ幸い私のレイアウトファイル

<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" 
        /> 

のパート - 例 -

Picasso loads pictures to the wrong imageview in a list adapter

のために私は次のことを試してみましたが、同じ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); 
     } 
    }); 
} 

    } 
} 

アップデートを持ってきました。ありがとうございました。

+0

イメージのみのようなnullの場合は、フォールバックを提供することができますが、テキストも紛失またはされていますか? – Soham

+0

@Soham画像のみが正しく配置されていません。 –

+0

アダプタクラスを投稿してください。 – Soham

答えて

6

ドロアブルが既に設定されているイメージビューを取得しているため、ドロアブルを外部設定します。 ImageViewが再作成されないので、ImageView内の前の画像は削除するまで表示されます。

+1

ここには何の変化も見られません。あなたは詳細を教えてください –

+1

この行をチェックしてくださいelse { imgImage.setImageDrawable(null); }。あなたのイメージビューはリサイクルされており、前回のイメージがあります。したがって、imageUrlがnullの場合は、そのイメージビューに存在するドロアブルをすべて削除する必要があります。これが動作するかどうか教えてください –

+0

よろしいですか?しかし、私はXMLレイアウト内にデフォルトの画像を持っています。画像のURLがnullの場合、その画像を表示します。その場合は –

0

onBindViewHolderでsetTagを使用すると、データが保持され、画像が失われることはありません。たぶん、あなたのアプローチを試してみてください

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

OR

は、多分それはあなたのビューが再利用され

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

動作します。

ImageViewの既存のリクエストをキャンセルするには、Picasso.with(imgImage.getContext()).cancelRequest(imgImage);に電話してください。

次に、あなたがarticle.getImage() != null場合は、あなたのイメージをロードして、あなたの記事の画像がimgImage.setImageDrawable(R.drawable.some_drawable);

関連する問題