【问题标题】:LiveData Observer for realmresults not getting triggered first time没有第一次触发领域结果的 LiveData Observer
【发布时间】:2019-08-05 06:15:53
【问题描述】:

我正在经历Guide to app architecture 并尝试在我的一个应用程序中实现 MVVM 和 LiveData。我正在使用领域,我正在使用this 创建一个 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)
}
}

这就是我将列表更新为 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
}

这就是我在存储库类中获取数据的方式

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)
}

编辑

这是视图模型

class HistoryViewModel: ViewModel() {

val repository = HistoryRepository()

fun getList(): RealmLiveData<Notes> {
    return repository.getHistory()
}
}

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

【问题讨论】:

  • 你能把HistoryViewModel的代码贴出来吗?
  • @ArkaPravaBasu 我已经添加了 ViewModel
  • 您在onAdded() 中添加results.addChangeListener(listener)。由于监听器是在第一个观察者附加到 LiveData 之后添加的,因此不会触发领域上的现有数据。这是我的猜测,没有用过Realm。
  • @ArkaPravaBasu 好的..这似乎是问题所在。你知道如何解决它吗?
  • @ArkaPravaBasu 添加更改监听器后,我调用了 listener.onChange(results)。如果您可以将其添加为答案,我将接受它,谢谢顺便说一句.. 对不起我的无知

标签: android mvvm kotlin realm android-livedata


【解决方案1】:

我们需要通知 Observer 已有数据。当第一个观察者注册到historyViewModel.getList() 时,您正在注册领域回调。此时我们需要触发一个变化,只是为了通知这个 Observer 已有数据。

类似

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)
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多