-1

リサイクラーアダプターで画像のURLを取得するためにネットワークコールを行います。 URLを受け取った後、ユニバーサル画像ローダを使用して画像を画像ビューに読み込みます。問題は、スクロールしていないときに画像が適切な場所にロードされたときですが、スクロールするとすぐに間違った場所で画像が膨張します。 は、ここに私のアダプタです:リサイクラービューの正しい位置に画像を読み込む

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

私は、ユーザーがスクロールされているかどうかを彼らの適切な場所にイメージをロードする方法が必要です。

+1

グライド、フレスコ画などの画像ローダーライブラリを使用してください。また、画像ホルダー –

+0

と重複する可能性があります。https://stackoverflow.com/questions/26525999/recyclerview-async-image-loading – Anthea

+0

@ ArbazRizvi別のライブラリを試してみますが、現在は[UIL](https://github.com/nostra13/Android-Universal-Image-Loader)を使っています –

答えて

0

あなたはsetHasStableIds(true)を設定します。

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

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

スクロール後もすべての画像を正確な位置に保ちます。

0

RecyclerViewはViewHoldersを再利用し、インフレーションとメモリの使用量を減らします。

正しい方法は、ビューの古い状態(画像をヌルとして設定)を消去し、新しいものを設定することです。

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

ダウンロードは、それが結合の方法ではありません非同期タスクがあるので、あなただけの古いものをクリアする理由、それはだ、それは[OnBind]の来るすべての回(試験前)、それをクリアすることを確認しますテキストの場合はすぐに設定することができます。

+0

ビューの古い状態をクリアするには –

+0

setImageBitmap (null)新しいものをダウンロードする前に –

+0

ありがとう –

0

非同期画像の読み込みにライブラリを使用することを検討してください。 Picasso。そこにあなたのアダプタでは...キャッシング、プレースホルダのように、あなたのための

を扱っているすべてのもの:

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

のGradle:

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

すべてです!

関連する問題