【发布时间】: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