在回收站视图中加载图片以更正位置

时间:2017-11-29 12:43:11

标签: android android-recyclerview kotlin recycler-adapter universal-image-loader

我在我的回收器适配器中进行网络呼叫以检索图片的网址。收到网址后,我使用通用图片加载程序将图片加载到图像视图中。问题是,当我不滚动图片被加载到正确的地方,但一旦我滚动图片是在错误的地方充气。 这是我的适配器:

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

如果用户正在滚动,我需要一种方法将图像加载到正确的位置。

3 个答案:

答案 0 :(得分:0)

你需要把setHasStableIds(true);在你的Adapter的构造函数中并放入:

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

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

因此,即使在滚动之后,它也会将所有图像保持在准确的位置。

答案 1 :(得分:0)

RecyclerView将重复使用ViewHolders来减少通胀和内存使用。

正确的方法是在onBindViewHolder中清除View的旧状态(将图像设置为null)并设置新的状态。

确保一直打开它(测试前)

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

由于下载是异步任务,因此在绑定时不会受到影响,这就是为什么你只清除旧版本的原因,因为文本可以立即设置。

答案 2 :(得分:0)

考虑使用库进行异步图像加载,例如Picasso。一切都是为你处理的,比如缓存,占位符......

在适配器中:

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

摇篮:

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

这就是全部!