- I am trying to perform update & delete operation in a recyclerview with - ListAdapter. For this example I am using- LiveDatato get updates as soon as data is updated.
- I don't know why list doesn't shows updated data, but when I see logs it shows correct data. 
Code:
@AndroidEntryPoint
class DemoActivity : AppCompatActivity() {
    var binding: ActivityDemoBinding? = null
    private val demoAdapter = DemoAdapter()
    private val demoViewModel: DemoViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityDemoBinding.inflate(layoutInflater)
        setContentView(binding?.root)
        initData()
    }
    private fun initData() {
        binding?.apply {
            btnUpdate.setOnClickListener {
                demoViewModel.updateData(pos = 2, newName = "This is updated data!")
            }
            btnDelete.setOnClickListener {
                demoViewModel.deleteData(0)
            }
            rvData.apply {
                layoutManager = LinearLayoutManager(this@DemoActivity)
                adapter = demoAdapter
            }
        }
        demoViewModel.demoLiveData.observe(this, {
            it ?: return@observe
            demoAdapter.submitList(it)
            Log.d("TAG", "initData: $it")
        })
    }
}
activity_demo.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.DemoActivity">
    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:text="Update Data" />
    <Button
        android:id="@+id/btn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:text="Delete Data" />
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/btn_update" />
</RelativeLayout>
DemoAdapter:
    class DemoAdapter() : ListAdapter<DemoModel, DemoAdapter.DemoViewHolder>(DiffCallback()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DemoViewHolder {
        val binding =
            ListItemDeleteBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return DemoViewHolder(binding)
    }
    override fun onBindViewHolder(holder: DemoViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.bind(currentItem)
    }
    inner class DemoViewHolder(private val binding: ListItemDeleteBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(student: DemoModel) {
            binding.apply {
                txtData.text = student.name + " " + student.visible
                if (student.visible) txtData.visible()
                else txtData.inVisible()
            }
        }
    }
    class DiffCallback : DiffUtil.ItemCallback<DemoModel>() {
        override fun areItemsTheSame(oldItem: DemoModel, newItem: DemoModel) =
            oldItem.id == newItem.id
        override fun areContentsTheSame(oldItem: DemoModel, newItem: DemoModel) =
            (oldItem.id == newItem.id) &&
                    (oldItem.visible == newItem.visible) &&
                    (oldItem.name == newItem.name)
    }
}
DemoViewModel:
class DemoViewModel : ViewModel() {
    var demoListData = listOf(
        DemoModel(1, "One", true),
        DemoModel(2, "Two", true),
        DemoModel(3, "Three", true),
        DemoModel(4, "Four", true),
        DemoModel(5, "Five", true),
        DemoModel(6, "Six", true),
        DemoModel(7, "Seven", true),
        DemoModel(8, "Eight", true)
    )
    var demoLiveData = MutableLiveData(demoListData)
    fun updateData(pos: Int, newName: String) {
        val listData = demoLiveData.value?.toMutableList()!!
        listData[pos].name = newName
        demoLiveData.postValue(listData)
    }
    fun deleteData(pos: Int) {
        val listData = demoLiveData.value?.toMutableList()!!
        listData.removeAt(pos)
        demoLiveData.postValue(listData)
    }
}
Martin's Solution: https://github.com/Gryzor/TheSimplestRV
 
    


 
    