关于recyclerview的ListAdapter的使用总结

397 阅读1分钟

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的问题,希望能够帮助到大家。