Recyclerview的ListAdpater是官方封装好了的能够异步比较两个数据集的强大的adapter,使用方法非常简单,具体用法可以参考这篇文章,在这里我想说的是,根据上述文章在增、删数据时候都没有问题,但是在改的时候,如果list里面的bean不是kotlin的data class类,那么我想说的是如果想要达到更改的效果,那么你的bean类需要实现cloneable接口,否则在触发areContentTheSame方法中,你会发现oldItem和newItem是同一个对象,无法达到更改的目的,具体使用方法如下:
class OvenBean2(
var name: String? = null, var age: String? = null, var isMale: Boolean? = null, var id: Int = 0, var itemType: Int = 0
) : Cloneable {//实现cloneable接口
public override fun clone(): Any {
return super.clone()
}
override fun toString(): String {
return "OvenBean(name=$name, age=$age, isMale=$isMale, id=$id)"
}
}
mainTv.setOnClickListener(v -> {
ArrayList<OvenBean2> clone = new ArrayList<>();
clone.addAll(mData);
OvenBean2 cl = clone.get(0);
OvenBean2 clone1 = (OvenBean2) cl.clone();
clone1.setName("mmodiy");
clone.set(0, clone1);
mAdapter.submitList(clone);//listadapter submitList()方法要求传入的list必须是一个新的list
});
如果数据类是kotlin的data class类型的话,这里就可以不用实现cloneable接口,在更改数据的时候直接调用对象的copy()方法即可,代码如下:
val newList = list.toMutableList().apply {
// this.removeAt(0)
// this[0].name = "click modify"
this[0] = this[0].copy().apply {
name = "click modify"
}//不copy就裂开
// Collections.swap(this, 0, 1)
// this.add(2, OvenBean(name = "click modify", age = "10", isMale = true))
}
// val oldList = (b.mainRc.adapter as MainAdapter).currentList
(b.mainRc.adapter as MainAdapter).submitList(newList)
以上就是我在使用时候遇到的关于Recyclerview ListAdapter的问题,希望能够帮助到大家。