我在我的回收器适配器中进行网络呼叫以检索图片的网址。收到网址后,我使用通用图片加载程序将图片加载到图像视图中。问题是,当我不滚动图片被加载到正确的地方,但一旦我滚动图片是在错误的地方充气。 这是我的适配器:
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
}
}
如果用户正在滚动,我需要一种方法将图像加载到正确的位置。
答案 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'
这就是全部!