LiveData Observer для реальных результатов не запускается с первого раза - PullRequest
2 голосов
/ 14 марта 2019

Я изучаю Руководство по архитектуре приложения и пытаюсь реализовать 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
}

Thisкак я получаю данные в своем классе репозитория

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

РЕДАКТИРОВАТЬ

Вот ViewModel

class HistoryViewModel: ViewModel() {

val repository = HistoryRepository()

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

Проблема в том, чтоНаблюдатель не запускается в первый раз. Если я обновляю realmresult, активируется актуальное обновление данных и обновляется мой список.Пожалуйста, дайте мне знать, как я могу решить эту проблему.

1 Ответ

1 голос
/ 14 марта 2019

Нам необходимо уведомить Обозревателя о существующих данных.Когда первый наблюдатель регистрируется на 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)
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...