2015-12-29 22 views
9

के साथ उपयोग करते समय पिकासो छवि गलत जगह समस्या मेरे ऐप में, मैं उन वेब लेखों से प्राप्त लेख दिखा रहा हूं। उन लेखों में शीर्षक, छवि और अन्य फ़ील्ड हैं। छवियों को प्रदर्शित करने के लिए, मैं Picasso का उपयोग कर रहा हूं।रीसाइक्लर व्यू

समस्या - रीसाइक्लिंग व्यू स्क्रॉल करते समय, मैं छवियों को गलत स्थानांतरित कर रहा हूं। कुछ वस्तुओं में डुप्लिकेट छवियां हैं। मुझे पता है कि यह RecyclerView है जो xml आइटम लेआउट का पुन: उपयोग करता है और इसके कारण यह एक समस्या पैदा कर रहा है। लेकिन मुझे लगता है कि इस समस्या का कुछ समाधान होना चाहिए। मैंने इसके बारे में गुमराह किया है और स्टैक ओवरफ्लो पर कुछ पोस्ट पाई हैं लेकिन इससे मदद नहीं मिली। मेरी लेआउट फ़ाइल के भाग

<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

के लिए मैं निम्नलिखित लेकिन एक ही समस्या

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

केवल चित्र की तरह अशक्त खो गया या भी ग्रंथों गया है सकते हैं? – Soham

+0

@ सोहम केवल छवियां गुम हो रही हैं। –

+0

क्या आप कृपया अपना एडाप्टर क्लास पोस्ट कर सकते हैं। – Soham

उत्तर

6

बाहरी रूप से आकर्षित करने योग्य सेट करें क्योंकि आपको छविदृश्य मिल रहा है जिसमें कुछ ड्रॉबल पहले से जुड़ा हुआ है। Imageview को फिर से नहीं बनाया जा रहा है, इसलिए ImageView में पिछली छवि तब तक दिखाई देगी जब तक आप इसे हटा नहीं देते।

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

मुझे यहां कोई बदलाव नहीं दिख रहा है। क्या आप विस्तृत कर सकते हैं –

+1

इस लाइन को और देखें { imgImage.setImageDrawable (शून्य); }। वास्तव में क्या हो रहा है यह है कि आपका इमेजव्यू रीसाइक्लिंग किया गया है और इसमें पिछली बार छवि है। तो अगर छवि यूआरएल शून्य है, तो आपको उस छविदृश्य में किसी भी ड्रॉइंग उपस्थिति को हटा देना चाहिए। मुझे बताएं कि यह –

+0

ठीक है या नहीं। लेकिन मेरे पास एक्सएमएल लेआउट के भीतर एक डिफ़ॉल्ट छवि है। मैं छवि को प्रदर्शित करना चाहता हूं अगर छवि यूआरएल शून्य है। –

0

ऑनविंडहोल्डर में सेटटैग का उपयोग करें, यह डेटा रखेगा और आपकी छवियां गलत नहीं होंगी।

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

या

हो सकता है कि अपने तरीके का प्रयास करें शायद यह काम करता है

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

आपका दृश्य पुन: उपयोग किया जाता है।

अपने छवि दृश्य के मौजूदा अनुरोधों को रद्द करने के लिए Picasso.with(imgImage.getContext()).cancelRequest(imgImage); पर कॉल करें।

तो फिर तुम अगर article.getImage() != null अपनी छवि को लोड और फ़ॉलबैक प्रदान करता है, तो अपने लेख छवि imgImage.setImageDrawable(R.drawable.some_drawable);

संबंधित मुद्दे