LiveData не наблюдается при реализации библиотеки подкачки в КотлинеAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 LiveData не наблюдается при реализации библиотеки подкачки в Котлине

Сообщение Anonymous »

Недавно я начал экспериментировать с Kotlin. Я пытаюсь реализовать библиотеку подкачки для получения списка с сервера. Я полностью следую статье ниже, чтобы реализовать то же самое.
https://proandroiddev.com/mvvm-with-kot ... 4ebb38c699

Код работает нормально для получения данных с сервера в DataSource, но по неизвестной причине List Observe не вызывается.

viewModel.ArticleList.observe()... (эта часть не работает.)

Подробнее Ниже приведены фрагменты кода реализации моего проекта.

package com.assessment.Articlebaseproject.repo.web.paging

import android.arch.lifecycle.MutableLiveData
import android.arch.paging.PageKeyedDataSource
import com.assessment.Articlebaseproject.model.Article
import com.assessment.Articlebaseproject.repo.web.ArticleApi
import com.assessment.Articlebaseproject.utils.State
import io.reactivex.Completable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.Action
import io.reactivex.schedulers.Schedulers

class ArticleDataSource(
private val ArticleApi: ArticleApi,
private val compositeDisposable: CompositeDisposable
) : PageKeyedDataSource() {

var state: MutableLiveData = MutableLiveData()
private var retryCompletable: Completable? = null

override fun loadInitial(params: LoadInitialParams, callback:
LoadInitialCallback) {
updateApiResponseState(State.LOADING)
compositeDisposable.add(
ArticleApi.getDeliveries(1, params.requestedLoadSize)
.subscribe(
{ response ->
updateApiResponseState(State.DONE)
callback.onResult(response, null, 2)
},
{
updateApiResponseState(State.ERROR)
setRetry(Action { loadInitial(params, callback) })
})
)
}

private fun setRetry(action: Action) {
retryCompletable = if (action == null) null else
Completable.fromAction(action)
}

override fun loadAfter(params: LoadParams, callback:
LoadCallback) {
updateApiResponseState(State.LOADING)
compositeDisposable.add(
ArticleApi.getDeliveries(params.key, params.requestedLoadSize)
.subscribe(
{ response ->
updateApiResponseState(State.DONE)
callback.onResult(
response,
params.key + params.requestedLoadSize
)
},
{
updateApiResponseState(State.ERROR)
setRetry(Action { loadAfter(params, callback) })
}
)
)
}

override fun loadBefore(params: LoadParams, callback:
LoadCallback) {

}

private fun updateApiResponseState(state: State) {
this.state.postValue(state)
}

fun retry() {
if (retryCompletable != null) {
compositeDisposable.add(
retryCompletable!!
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
)
}
}
}


DataSourceFactory

package com.assessment.Articlebaseproject.repo.web.paging

import android.arch.lifecycle.MutableLiveData
import android.arch.paging.DataSource
import com.assessment.Articlebaseproject.model.Article
import com.assessment.Articlebaseproject.repo.web.ArticleApi
import io.reactivex.disposables.CompositeDisposable

class ArticleDataSourceFactory(
private val compositeDisposable: CompositeDisposable,
private val ArticleApi: ArticleApi
) : DataSource.Factory() {

val ArticleDataSourceLiveData = MutableLiveData()

override fun create(): DataSource {
val ArticleDataSource = ArticleDataSource(ArticleApi,
compositeDisposable)
ArticleDataSourceLiveData.postValue(ArticleDataSource)
return ArticleDataSource
}
}


Модель просмотра

package com.assessment.Articlebaseproject.ui.ArticleList

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.Transformations.
import android.arch.paging.LivePagedListBuilder
import android.arch.paging.PagedList
import android.view.View
import com.assessment.Articlebaseproject.base.BaseViewModel
import com.assessment.Articlebaseproject.db.dao.ArticleDao
import com.assessment.Articlebaseproject.model.Article
import com.assessment.Articlebaseproject.repo.web.ArticleApi
import com.assessment.Articlebaseproject.repo.web.paging.ArticleDataSource
import com.assessment.Articlebaseproject.repo.web.paging.ArticleDataSourceFactory
import com.assessment.Articlebaseproject.utils.State
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import javax.inject.Inject

class ArticleListViewModel(private val ArticleDao: ArticleDao) : BaseViewModel() {

val ArticleListAdapter: ArticleListAdapter
val isLoading: MutableLiveData = MutableLiveData()
var errorMsg: MutableLiveData = MutableLiveData()
var errorClick = View.OnClickListener { TODO() }
private val pageLimit: Int = 10
private val compositeDisposable = CompositeDisposable()
var ArticleList: LiveData
>
private val ArticleDataSourceFactory: ArticleDataSourceFactory

@Inject
lateinit var ArticleApi: ArticleApi

private lateinit var ArticleSubscription: Disposable

init {
isLoading.value = View.GONE
ArticleListAdapter = ArticleListAdapter { retry() }
ArticleDataSourceFactory = ArticleDataSourceFactory(compositeDisposable, ArticleApi)
val config = PagedList.Config.Builder()
.setPageSize(pageLimit)
.setInitialLoadSizeHint(pageLimit * 2)
.setEnablePlaceholders(false)
.build()
ArticleList = LivePagedListBuilder(ArticleDataSourceFactory, config).build()
}

fun getState(): LiveData = Transformations.switchMap(ArticleDataSourceFactory.ArticleDataSourceLiveData, ArticleDataSource::state)

fun retry() {
ArticleDataSourceFactory.ArticleDataSourceLiveData.value?.retry()
}

fun listIsEmpty(): Boolean {
return ArticleList.value?.isEmpty() ?: true
}

override fun onCleared() {
super.onCleared()
ArticleSubscription.dispose()
compositeDisposable.dispose()
}
}


Действия

package com.assessment.Articlebaseproject.ui.ArticleList

import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.databinding.DataBindingUtil
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v7.widget.DividerItemDecoration
import android.support.v7.widget.LinearLayoutManager
import android.util.Log
import com.assessment.Articlebaseproject.R
import com.assessment.Articlebaseproject.base.BaseActivity
import com.assessment.Articlebaseproject.databinding.ActivityArticleListBinding
import com.assessment.Articlebaseproject.di.ViewModelFactory
import com.assessment.Articlebaseproject.utils.NetworkUtils

class ArticleListActivity : BaseActivity() {

private lateinit var dataBinding: ActivityArticleListBinding
private lateinit var viewModel: ArticleListViewModel

override fun layoutRes(): Int {
return R.layout.activity_Article_list
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

dataBinding = DataBindingUtil.setContentView(this, layoutRes())
setListView()
viewModel = ViewModelProviders.of(this, ViewModelFactory(this))
.get(ArticleListViewModel::class.java)
dataBinding.viewModel = viewModel
observeLiveData()
if (!NetworkUtils.isConnectingToInternet(this)) {
displayError(R.string.error_no_network)
}
}

private fun observeLiveData() {
viewModel.errorMsg.observe(this, Observer { error ->
if (error != null) displayError(error) else hideError()
})

viewModel.ArticleList.observe(this, Observer {
viewModel.ArticleListAdapter.submitList(it)
})

viewModel.getState().observe(this, Observer {
Log.d("", it.toString())
})
}

private fun hideError() {
snackBar?.dismiss()
}

private fun displayError(error: Int) {
snackBar = Snackbar.make(dataBinding.root, error, Snackbar.LENGTH_INDEFINITE)
snackBar?.setAction(R.string.retry, viewModel.errorClick)
snackBar?.show()
}

private fun setListView() {
dataBinding.ArticleList.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
dataBinding.ArticleList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
}
}


Подробнее здесь: https://stackoverflow.com/questions/565 ... ntation-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обновите один элемент в PagedList с помощью библиотеки подкачки Google.
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • LiveData не наблюдается/вызывается во фрагменте/активности [закрыто]
    Anonymous » » в форуме Android
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать элементы в PagedList? (Библиотека подкачки компонентов Android Arch)
    Anonymous » » в форуме Android
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как получить LiveData списка элементов, соответствующих содержимому другого LiveData из Firestore?
    Anonymous » » в форуме Android
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Есть ли способ сделать аналог InsertSeparators PagedList?
    Anonymous » » в форуме Android
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»