gpt4 book ai didi

android - Realm 结果的 LiveData Observer 第一次没有被触发

转载 作者:行者123 更新时间:2023-11-29 00:55:30 28 4
gpt4 key购买 nike

我正在浏览 Guide to app architecture并尝试在我的一个应用程序中实现 MVVM 和 LiveData。我正在使用 Realm ,我正在使用 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)
}

编辑

这是 View 模型

class HistoryViewModel: ViewModel() {

val repository = HistoryRepository()

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

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

最佳答案

我们需要将现有数据通知观察者。当第一个观察者注册到 historyViewModel.getList() 时,您正在注册 Realm 回调。此时我们需要触发一个更改,只是为了通知这个 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)
}
}

关于android - Realm 结果的 LiveData Observer 第一次没有被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161048/

28 4 0