-1

리사이클 러 어댑터에서 네트워크 URL을 검색하여 그림의 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

과 중복되는 이미지 URL을 유지하십시오. 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를 다시 사용하여 인플레이션 및 메모리 사용을 줄입니다.

올바른 방법은 onBindViewHolder에서 View의 이전 상태를 지우고 (이미지를 null로 설정) 새 인스턴스를 설정하는 것입니다.

,

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' 

다야 그!