У меня есть 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
?