RecyclerView实现网络图片多选的最佳实现

如果你也有这样的需求,以下会帮你跨越一些坑:

1、加载更多图片时图片显示错乱,选中状态也被复用;
2、调用 notifyDataSetChanged() 时图片闪烁;

该需求实现使用了 RecyclerView 和 Glide 图片加载;

第1个问题是由于 RecyclerView 的复用导致,所以需要在 Adapter 中的加载图片的地方,设置 View 的 tag 来判断view是否被复用,如:

//设置复选框的tag, (!不要将tag设置在imgView上,否则Glide会抛异常)
val url = mUrls.get(position)
if(cbChosen.tag != url){
    cbChosen.tag = url
    Glide.with(imgView).load(url).into(imgView)
}

当你完成上面的操作,图片显示就没什么问题了。

而当你长按或者点编辑需要显示复选框(CheckBox)时,需要调用notifyDataSetChanged() 去更新所有 Item 的显示,这时候会出现图片重新加载的闪烁。

这时候,第2个问题出现了,这里需要用到 adapter 的 setHasStableIds(true)

//在 Adapter 创建的时候
adapter.setHasStableIds(true)

//然后再 Adapter 中重写 getItemId() 方法,并修改器返回值
override fun getItemId(position: Int): Long{
    return position.toLong()
}

//注意,一定要重写getItemId()方法

至此,就有了一个比较好的效果了!

你可能感兴趣的:(RecyclerView实现网络图片多选的最佳实现)