Как сохранить данные разбивки на страницы в ViewModel Android? - PullRequest
1 голос
/ 30 мая 2020

При повороте устройства я теряю данные предыдущей загруженной страницы. Как я могу решить эту проблему?

В приведенной ниже реализации в ViewModel сохраняются только данные текущей страницы, но все остальные страницы теряются. Любое решение для этого?

Ответ API (страница 1) http://www.mocky.io/v2/5ed20f9732000052005ca0a6

ViewModel

class NewsApiViewModel(application: Application) : AndroidViewModel(application) {

    val topHeadlines = MutableLiveData<TopHeadlines>()
    var networkLiveData = MutableLiveData<Boolean>()

    fun fetchTopHeadlines(pageNumber: Int) {
        if (!getApplication<Application>().hasNetworkConnection()) {
            networkLiveData.value = false
        }
        val destinationService = ServiceBuilder.buildService(DestinationService::class.java)
        val requestCall = destinationService.getTopHeadlines(AppConstants.COUNTRY_INDIA, AppConstants.PAGE_SIZE, pageNumber, AppConstants.NEWS_API_KEY)
        requestCall.enqueue(object : Callback<TopHeadlines> {
            override fun onFailure(call: Call<TopHeadlines>, t: Throwable) {
                Log.e("ANKUSH", "$t ")
            }

            override fun onResponse(call: Call<TopHeadlines>, response: Response<TopHeadlines>) {
                if (response.isSuccessful) {
                    topHeadlines.postValue(response.body())
                }
            }
        })
    }

}

MainActivity

fun observeAndUpdateData() {
        activity.viewModel.topHeadlines.observeForever {
            isDataLoading = false
            checkAndShowLoader(isDataLoading)
            if (AppConstants.STATUS_OK == it.status) {
                it.articles?.let { articles ->
                    if (articles.size < AppConstants.PAGE_SIZE) {
                        activity.isAllDataLoaded = true
                    }
                    activity.adapter.updateData(articles)
                }
            }
        }
    }

fun getTopHeadlines(pageNumber: Int) {
        if (activity.isAllDataLoaded) return
        isDataLoading = true
        checkAndShowLoader(isDataLoading)
        activity.viewModel.fetchTopHeadlines(pageNumber)
    }

1 Ответ

1 голос
/ 30 мая 2020

Вам просто нужно сохранить current page и the data, которые вы собрали в списке в ViewModel.

Так что не передавайте номер страницы в функцию fetchTopHeadlines, вместо этого рассмотрите возможность частная глобальная переменная в ViewModel и каждый раз, когда вы вызываете fetchTopHeadlines, увеличивайте номер страницы.

Также, чтобы предотвратить потерю предыдущих страниц, рассмотрите возможность наличия ArrayList в вашей ViewModel. После получения данных с сервера сначала поместите все свои данные в список, определенный в ViewModel, а затем опубликуйте sh этот список в свой View.

Вот пример, который поможет вам с этим справиться .

...