将RealmObject与Recyclerview ListAdapter结合使用

时间:2019-03-21 15:13:19

标签: android android-recyclerview realm

由于只能在创建它们的线程中访问RealmObject,因此无法使用 ListAdapter 来使用RealmObject,因为使用了 AsyncListDiffer 在这种情况下,您将获得此异常

  

来自错误线程的领域访问。只能在创建对象的线程上访问领域对象。

还有其他选择吗?我的第一个建议是将RealmObject映射到表示视图数据的Pojo中,但是由于列表上有很多更改,这会减慢UI线程的速度。

2 个答案:

答案 0 :(得分:0)

如果仅在DiffUtil.ItemCallback中进行简单比较,则可以使用一个类包装Realm数据。

class User: RealmObject {
   @PrimaryKey
   var uuid: String? = null
}
data class WrappedUserData(val uuid: Long, val user: User)

然后使用该类作为适配器的项目类型

class MyAdapter: ListAdapter<WrappedUserData, ItemViewHolder>

并使用包装的类进行比较。

private val ITEM_CALLBACK = object : DiffUtil.ItemCallback<WrappedUserData>() {
    override fun areItemsTheSame(oldItem: WrappedUserData, newItem: WrappedUserData): Boolean {
        return oldItem.uuid == newItem.uuid
    }

    override fun areContentsTheSame(oldItem: WrappedUserData, newItem: WrappedUserData): Boolean {
        return oldItem.uuid == newItem.uuid
    }
}

调用myAdapter.submitList时,只需要将原始数据映射到WrappedUser列表即可。

答案 1 :(得分:0)

使用Realm.copyFromRealm()以来可用的0.87.0来复制已经持久的RealmObject。