RecyclerView实现网络图片多选的最佳实现
2019-06-27 本文已影响0人
方凌川
如果你也有这样的需求,以下会帮你跨越一些坑:
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()方法
至此,就有了一个比较好的效果了!