Android realmresults的LiveData观察者未首次触发

Android realmresults的LiveData观察者未首次触发,android,mvvm,kotlin,realm,android-livedata,Android,Mvvm,Kotlin,Realm,Android Livedata,我正在经历并尝试在我的一个应用程序中实现MVVM和LiveData。我正在使用realm,我正在使用创建一个RealmLiveData,如下所示 class RealmLiveData<T : RealmModel>(private val results: RealmResults<T>) : MutableLiveData<RealmResults<T>>() { private val listener = RealmChangeListen

我正在经历并尝试在我的一个应用程序中实现MVVM和LiveData。我正在使用realm,我正在使用创建一个RealmLiveData,如下所示

class RealmLiveData<T : RealmModel>(private val results: RealmResults<T>) : MutableLiveData<RealmResults<T>>() {
private val listener = RealmChangeListener<RealmResults<T>> { results -> value = results }
override fun onActive() {
    results.addChangeListener(listener)
}

override fun onInactive() {
    results.removeChangeListener(listener)
}
}
类RealmLiveData(私有val结果:RealmResults):MutableLiveData(){
private val listener=RealmChangeListener{results->value=results}
override-onActive(){
结果。addChangeListener(listener)
}
重写函数onInactive(){
结果:removeChangeListener(listener)
}
}
这就是我更新列表到recyclerview的方式

var mList:ArrayList<Notes> = ArrayList()

lateinit var historyViewModel: HistoryViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_history, container, false)
    mRCview = view.findViewById(R.id.list)
    historyViewModel = ViewModelProviders.of(activity!!).get(HistoryViewModel::class.java)

    // this is how I observe
    historyViewModel.getList().observe(this, Observer{
        (mRCview.adapter as MyHistoryRecyclerViewAdapter).setData(it)
    })

    with(mRCview) {
        setHasFixedSize(true)
        layoutManager = LinearLayoutManager(mContext)
        mList = ArrayList()
        adapter = MyHistoryRecyclerViewAdapter(
            mContext as OnListFragmentInteractionListener
        )
    }
    return view
}
var-mList:ArrayList=ArrayList()
lateinit var historyViewModel:historyViewModel
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看?{
val视图=充气机。充气(R.layout.fragment_历史,容器,错误)
mRCview=view.findviewbyd(R.id.list)
historyViewModel=ViewModelProviders.of(activity!!).get(historyViewModel::class.java)
//这就是我观察到的
historyViewModel.getList().observe(这个,观察者{
(mRCview.adapter作为MyHistoryRecycleServiceAdapter)。设置数据(it)
})
带(mRCview){
setHasFixedSize(真)
layoutManager=LinearLayoutManager(mContext)
mList=ArrayList()
适配器=MyHistoryRecycleServiceAdapter(
McContext作为OnListFragmentInteractionListener
)
}
返回视图
}
这就是我在repository类中获取数据的方式

class HistoryRepository {

fun getHistory(): RealmLiveData<Notes> {
    val realmInstance = Realm.getDefaultInstance()
    val realmResults = realmInstance
        .where(Notes::class.java)
        .findAll()
        .sort("lastUpdatedTimeStamp", Sort.DESCENDING)
    return realmResults.asLiveData()
}

fun <T:RealmModel> RealmResults<T>.asLiveData() = RealmLiveData(this)
}
类历史存储库{
fun getHistory():RealmLiveData{
val realmInstance=Realm.getDefaultInstance()
val realmResults=realmInstance
.where(Notes::class.java)
.findAll()
.sort(“lastUpdatedTimeStamp”,sort.DESCENDING)
返回realmResults.asLiveData()
}
fun RealmResults.asLiveData()=RealmLiveData(此)
}
编辑

这是ViewModel

class HistoryViewModel: ViewModel() {

val repository = HistoryRepository()

fun getList(): RealmLiveData<Notes> {
    return repository.getHistory()
}
}
class HistoryViewModel:ViewModel(){
val repository=HistoryRepository()
fun getList():RealmLiveData{
return repository.getHistory()
}
}

问题是观察者不是第一次被触发。如果我更新realmresult,则会调用实时数据更新并更新我的列表。请告诉我如何解决此问题。

我们需要将现有数据通知观察者。当第一个观察者注册到
historyViewModel.getList()
时,您正在注册领域回调。在这一点上,我们需要触发一个更改,以便将现有数据通知给这个观察者

差不多

class RealmLiveData<T : RealmModel>(private val results: RealmResults<T>) : MutableLiveData<RealmResults<T>>() {
private val listener = RealmChangeListener<RealmResults<T>> { results -> value = results }
override fun onActive() {
    results.addChangeListener(listener)
    listener.onChange(results) // notify the added Observer of the existing data.
}

override fun onInactive() {
    results.removeChangeListener(listener)
}
}
类RealmLiveData(私有val结果:RealmResults):MutableLiveData(){
private val listener=RealmChangeListener{results->value=results}
override-onActive(){
结果。addChangeListener(listener)
onChange(results)//将现有数据通知添加的观察者。
}
重写函数onInactive(){
结果:removeChangeListener(listener)
}
}

你能发布
历史视图模型的代码吗?@ArkaPravaBasu我已经添加了你正在添加的视图模型
结果。addChangeListener(listener)
onAdded()中。由于监听器是在第一个观察者附加到LiveData之后添加的,因此不会触发realm上的现有数据。这是我的猜测,没有使用领域。@ArkaPravaBasu好的。这似乎是问题所在。你知道如何修复它吗?@ArkaPravaBasu我在添加changelistener后调用了listener.onChange(results)。如果你可以添加它作为一个答案,我会接受它,谢谢顺便说一句。。对不起我的无知