2015-12-29 19 views
9

Trong ứng dụng của tôi, tôi đang hiển thị các bài viết đang được tìm nạp từ một dịch vụ web. Những bài viết có tiêu đề, hình ảnh và các lĩnh vực khác. Để hiển thị hình ảnh, tôi đang sử dụng Picasso.Vấn đề đặt sai hình ảnh Picasso khi sử dụng với RecyclerView

Sự cố - Trong khi cuộn RecyclerView, tôi thấy các hình ảnh bị đặt sai chỗ. Một số mục có hình ảnh trùng lặp. Tôi biết nó là RecyclerView mà reuses bố trí mục xml và do đó nó đang tạo ra một vấn đề. Nhưng tôi nghĩ rằng phải có một số giải pháp cho vấn đề này. Tôi đã googled về điều này và tìm thấy một số bài viết trên stackoverflow nhưng điều đó đã không giúp đỡ. Đối với example-

Picasso loads pictures to the wrong imageview in a list adapter

Tôi đã thử những điều sau đây nhưng có cùng một vấn đề-

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); 
     } 
    }); 
} 

    } 
} 

Update - Một phần của file layout của tôi

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

Bất kỳ trợ giúp sẽ được đánh giá cao . Cảm ơn bạn.

+0

Chỉ những hình ảnh đã bị thất lạc hoặc các văn bản cũng? – Soham

+0

@Soham Chỉ những hình ảnh bị thất lạc. –

+0

Bạn có thể vui lòng đăng lớp bộ điều hợp của mình không. – Soham

Trả lời

6

Đặt bên ngoài có thể vẽ được vì bạn đang nhận được số lần xem hình ảnh có một số điểm có thể kéo được đã gắn liền với nó. Imageview không được tạo lại để hình ảnh trước đó trong ImageView sẽ hiển thị cho đến khi bạn xóa nó.

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

Tôi không thấy bất kỳ thay đổi nào ở đây. Bạn có thể vui lòng xây dựng –

+1

kiểm tra dòng này khác { imgImage.setImageDrawable (null); }. actuly whats xảy ra là imageview của bạn được tái chế và nó có hình ảnh từ lần cuối cùng. Vì vậy, nếu imageUrl là null, bạn nên xóa bất kỳ món quà có thể vẽ nào trong số lần xem đó. Hãy cho tôi biết nếu điều này làm việc –

+0

Được rồi. Nhưng tôi đang có một hình ảnh mặc định trong bố cục xml. Tôi muốn hình ảnh đó được hiển thị nếu url hình ảnh rỗng. –

0

Sử dụng setTag in onBindViewHolder nó sẽ giữ dữ liệu và hình ảnh của bạn sẽ không sai.

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

HOẶC

Có thể thử phương pháp của bạn có lẽ nó hoạt động

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

xem của bạn được tái sử dụng.

Gọi Picasso.with(imgImage.getContext()).cancelRequest(imgImage); để hủy mọi yêu cầu hiện tại của ImageView của bạn.

Sau đó, bạn có thể tải hình ảnh của bạn nếu article.getImage() != null và cung cấp một dự phòng nếu hình ảnh bài viết của bạn là null như imgImage.setImageDrawable(R.drawable.some_drawable);

Các vấn đề liên quan