Обновление отдельной строки в Recyclerview с привязкой и Livedata - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть Recyclerview настройка с databinding и LiveData, использующая базу данных области.

По большей части работает, за исключением того, что Recyclerview не обновляет строки должным образом.

На моем Дао я получаю свои LiveData результаты как таковые. (нет проблем с заполнением Recyclerview):

fun getList(): LiveData<RealmResults<Entity>>{
    return db.where(Entity::class.java).sort("sortKey",Sort.DESCENDING).findAllAsync().asLiveData()
}

My ViewModel устанавливает данные следующим образом:

val realm: Realm by lazy {
    Realm.getDefaultInstance()
}

private var entityDao = EntityDao(realm)

init {
    myEntities = Transformations.map(EntityDao.getList()){ input -> input }
}

Вот настройка Recyclerview, которую яиметь в моем Fragment:

binding.savedPostsRecyclerView.layoutManager = LinearLayoutManager((activity as Context?)!!)

binding.vm?.myEntities?.observe(viewLifecycleOwner, Observer{
    it?.let {
        adapter.submitList(it)
    }
})

В моем фрагменте также я обновляю свою базу данных и сохраняю ее в Realm (что обновляет):

adapter = EntityAdapter(EntityListener { entity ->
        realm.executeTransaction {
            entity.uploadState = "uploading"
            it.copyToRealmOrUpdate(entity)
        }

}

Здесь, где я связываю свои Adapter предметы:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(getItem(position)clickListener)
}

fun bind(item: Entity, clickListener: SavedMapEntityListener) {
      binding.dbEntity = item
      binding.clickListener = clickListener
      binding.executePendingBindings(
}

Я использую DiffUtil для прослушивания изменений:

class EntityDiffCallback : DiffUtil.ItemCallback<Entity>() {


    override fun areItemsTheSame(oldItem: Entity, newItem: Entity): Boolean {
        return oldItem.id == newItem.id
    }

    override fun areContentsTheSame(oldItem: Entity, newItem: Entity): Boolean {
        return oldItem.equals(newItem)
    }
}

У меня есть 2 проблемы здесь.

1- Когда я добавляю элемент в LiveData<RealmResults<Entity>>, я вижу, что база данных Realm обновлена, и я вижу, что в нижней части моего Recyclerview добавлен дополнительный элементхотя он должен отображаться вверху, а добавленный элемент отображается как копия предыдущего элемента.

2- У меня есть Button в каждой ячейке, которая должна менять цвет при нажатии. Даже если я получаю подтверждение, что кнопка нажата, строка не обновляется сама.

Вот мои вопросы: Как мне правильно обновить Recyclerview, чтобы отразить изменения при добавлении элемента или нажатии на строку Button?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...