-1

Ich mache einen Netzwerkanruf in meinem Recycleradapter, um die URL für ein Bild abzurufen. Nachdem die URL empfangen wurde, verwende ich Universal Image Loader, um das Bild in eine Bildansicht zu laden. Das Problem ist, wenn ich nicht scrolle, werden die Bilder an den richtigen Platz geladen, aber sobald ich scrolle, sind die Bilder an der falschen Stelle aufgeblasen. Hier ist mein Adapter:Das Bild wird in die Recycler-Ansicht geladen

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 
    if (holder is ViewHolder) { 
     val article = feeds[position] 

     holder.articleTitle.setFont("SourceSansPro-SemiBold.ttf") 
     holder.articleDescription.setFont("OpenSans-Regular.ttf") 
     holder.articleTime.setFont("OpenSans-Light.ttf") 

     mAnimator?.onBindViewHolder(holder.itemView, position) 
     holder.apply { 
      article.apply { 
       articleTitle.text = title 
       articleDescription.text = Html.fromHtml(description) 
       articleTime.text = TimeUtils.convertLongToTime(pubDate) 

       if (image.isBlank()){ 
        //load picture url when it's empty 
        mContext?.doAsync { 
         ImageExtractor.extractImageUrl(link, object : OnImageExtractorListener { 
          override fun onSuccess(url: String) { 
           v("imaaaage success $title $url") 
           mContext?.runOnUiThread { 
            article.image = url 

            //use uil to load the image didn't work so I tried just updating the model 
            //articleImage.displayImage(url) 

            feeds[position] = article 
            notifyItemChanged(position) 
           } 
           val dbo = context.getDatabase() 
           dbo.updateArticleImage(dbo,url,article.id) 
          } 

          override fun onError() { 
          } 
         }) 
        } 
       }else{ 
        articleImage.displayImage(image) 
        isRead?.let { 
         if (isRead!! && !isSaved){ 
          grayScale(holder) 
         } 
        } 
       } 

       container.setOnClickListener { 
        itemClick(this) 
        if (!isSaved){ 
         article.isRead = true 
         feeds[position] = article 
         notifyItemChanged(position) 
        } 
       } 
      } 
     } 
    }else if (holder is LoadingViewHolder){ 
     holder.progressBar.isIndeterminate = true 
    } 
} 

ich einen Weg brauchen, um die Bilder in ihren richtigen Stellen zu laden, wenn der Benutzer oder nicht scrollen.

+1

Versuchen Sie ein beliebiges Bild loader-Bibliothek wie Gleitflug zu verwenden, Fresko usw. und auch mit Ihrem viewholder –

+0

möglich doppelte Ihre Bild-URL pflegen: https://stackoverflow.com/questions/26525999/recyclerview-async-image-loading – Anthea

+0

@ ArbazRizvi Ich werde eine andere Bibliothek versuchen und sehen, aber ich verwende derzeit [UIL] (https://github.com/nostra13/Android-Universal-Image-Loader) –

Antwort

0

Sie nedd setHasStableIds setzen (true); im Konstruktor Ihres Adapters und setzen:

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

So wird es alle Bilder an exakten Positionen auch nach dem Scrollen halten.

0

Der RecyclerView wird ViewHolder wiederverwenden, um die Inflation und den Speicherverbrauch zu reduzieren.

Der richtige Weg ist im OnBindViewHolder ist es, den alten Zustand der Ansicht zu löschen (Bild als null zu setzen) und die neuen zu setzen.

Stellen Sie sicher, es jederzeit es (vor dem Test) kommt onBind zu löschen

articleImage.displayImage(null) 
if (image.isBlank()){ 

Da das Herunterladen eine Asynchron-Aufgabe ist es nicht auf die Art und Weise sein wird, wenn die Bindung, das ist, warum Sie nur die alten löschen, Für Texte steht es sofort zur Verfügung.

+0

Wie lösche ich den alten Zustand der Ansicht –

+0

setImageBitmap (null) vor dem Herunterladen der neuen –

+0

Danke wird es ausprobieren und sehen –

0

Verwenden Sie eine Bibliothek zum Laden von asynchronen Bildern, z. Picasso. Es ist alles für Sie behandelt, wie Caching, Platzhalter ...

In Ihrem Adapter:

Picasso.with(context).load("url") 
.placeholder(R.drawable.user_placeholder).into(imageView); 

Gradle:

compile 'com.squareup.picasso:picasso:2.5.2' 

Das ist alles!

Verwandte Themen