1

DiffUtil do not update items recyclerview with the same id and not same the content, The model has [id : Int and title : String]. I want to the diffUtilCallBack check items with the same id and not same title and update to recyclerview Please help me fix it

my DiffUtil CallBAck

class DiffCB(
val oldl : ArrayList<Test>,
val newl : ArrayList<Test>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int {
    return oldl.size
}

override fun getNewListSize(): Int {
    return newl.size
}

override fun areItemsTheSame(oldItemPos: Int, newItemPos: Int): Boolean {
    return oldl[oldItemPos].id == newl[newItemPos].id
}

override fun areContentsTheSame(oldItemPos: Int, newItemPos: Int): Boolean {
    return oldl[oldItemPos].title.equals(newl[newItemPos].title)
}
}

my Adapter.kt

class TestAdapter(val click: TestClick) : 
RecyclerView.Adapter<TestAdapter.TestVH>() {

var list: ArrayList<Test> = ArrayList()

inner class TestVH(val bin: ItemTestBinding) : RecyclerView.ViewHolder(bin.root) {
    fun bind(test: Test) {
        bin.tvTestId.text = "[id: ${test.id}]"
        bin.tvTestTitle.text = test.title
        bin.cbTest.isChecked = test.select
        bin.cbTest.setOnClickListener {
            click.click(test)
        }
    }
}

fun sumbitData(newl: ArrayList<Test>) {
    val diff = DiffCB(this.list, newl)
    val diffResult = DiffUtil.calculateDiff(diff)
    list.clear()
    this.list.addAll(newl)
    diffResult.dispatchUpdatesTo(this)
}

override fun getItemCount(): Int {
    return list.size
}

override fun onBindViewHolder(holder: TestVH, position: Int) {
    holder.bind(list[position])
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestVH {
    return TestVH(ItemTestBinding.inflate(LayoutInflater.from(parent.context), 
parent, false))
}
}

my Activity.kt

class TestActivity : AppCompatActivity(), TestClick {
private var list : ArrayList<Test> = ArrayList()
private lateinit var bin : ActivityTestBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    bin = ActivityTestBinding.inflate(layoutInflater)
    setContentView(bin.root)
    val viewModel = ViewModelProviders.of(this).get(TestViewModel::class.java)
    val manager = LinearLayoutManager(this)
    bin.rvTest.layoutManager = manager
    val adapter = TestAdapter(this)
    bin.rvTest.adapter = adapter
    //init first data
    viewModel.setTests(initData())
    viewModel.getTests().observe(this, Observer {
        adapter.sumbitData(it as ArrayList<Test>)
    })
    bin.btnTest.setOnClickListener{
        viewModel.setTests(updateData())
    }
}

fun updateData() : ArrayList<Test> {
    for (i in 2..6) {
        var test = Test()
        test.id = i
        test.title = "title test $i update"
        list.add(test)
    }
    return list
}

fun initData() : ArrayList<Test> {
    for (i in 1..3) {
        var test = Test()
        test.id = i
        test.title = "title test $i"
        list.add(test)
    }
    return list
}

override fun click(test: Test) {
    Toast.makeText(this, "${test.id}  ${test.title}", Toast.LENGTH_SHORT).show()
}
}

it is first data

after update data, items with the same id have not been updated (id 2, 3)

0 Answers0