From e2de7891f0cbb9dfbdbf82101a8069c51dce8a66 Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Tue, 30 Jun 2020 15:58:25 +0200 Subject: [PATCH] Solved an issue in which the endless recycler view stopped working on layout refresh --- .../views/fragments/news/NewsFragment.kt | 13 ++++- .../views/viewmodels/NewsViewModel.kt | 57 ++++++++++++------- .../collections/NewsInformation.kt | 16 +++--- .../main/res/layout/loading_recycler_view.xml | 36 +++++++++++- app/src/main/res/raw/error_state.json | 1 + 5 files changed, 90 insertions(+), 33 deletions(-) create mode 100644 app/src/main/res/raw/error_state.json diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/news/NewsFragment.kt b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/news/NewsFragment.kt index 5ace171..b612294 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/news/NewsFragment.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/fragments/news/NewsFragment.kt @@ -69,6 +69,11 @@ class NewsFragment : BaseFragmentView(), LayoutVisibilityChange { newsViewModel.newsData.observe(viewLifecycleOwner, Observer { if (::footerAdapter.isInitialized) footerAdapter.clear() + if (it.hasError) { + if (newsAdapter.adapterItemCount == 0) { + + } + } if (it.id !in activeItems) { val newsObject = News( title = it.title, @@ -128,9 +133,15 @@ class NewsFragment : BaseFragmentView(), LayoutVisibilityChange { refreshLayout.isRefreshing = true newsAdapter.clear() activeItems.clear() + footerAdapter.clear() + scrollListener.disable() lifecycleScope.launch { newsViewModel.populateData(language = UserProperties.language) - }.invokeOnCompletion { refreshLayout.isRefreshing = false } + }.invokeOnCompletion { + refreshLayout.isRefreshing = false + scrollListener.enable() + scrollListener.resetPageCount() + } container.visibility = View.INVISIBLE } } diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/viewmodels/NewsViewModel.kt b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/viewmodels/NewsViewModel.kt index a2a9075..5a0f430 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/viewmodels/NewsViewModel.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/activities/views/viewmodels/NewsViewModel.kt @@ -32,6 +32,7 @@ import kotlinx.coroutines.withContext import okhttp3.Headers import timber.log.Timber import java.io.Reader +import java.util.* class NewsViewModel : ViewModel() { @@ -42,30 +43,44 @@ class NewsViewModel : ViewModel() { amount: Int = 10, @Language language: String = Language.ENGLISH ) { - val httpRequest = HttpDownloader() - val klaxon = with(Klaxon()) { - propertyStrategy(newsStrategy) - fieldConverter(KlaxonDate::class, dateConverter) - fieldConverter(KlaxonElements::class, elementConverter) - } - var requestReader: Reader? = null - Auth.init() - val token = Auth.token() - Timber.d("Auth token: $token") - withContext(Dispatchers.IO) { - requestReader = httpRequest.json( - "${API_URL}/api/v1?from=$from&amount=$amount&lang=$language", - headers = Headers.of(mapOf("Authorization" to "Bearer $token")) - ) - } - withContext(Dispatchers.Default) { - JsonReader(requestReader!!).use { reader -> - reader.beginArray { - while (reader.hasNext()) { - newsData.postValue(klaxon.parse(reader)) + try { + val httpRequest = HttpDownloader() + val klaxon = with(Klaxon()) { + propertyStrategy(newsStrategy) + fieldConverter(KlaxonDate::class, dateConverter) + fieldConverter(KlaxonElements::class, elementConverter) + } + var requestReader: Reader? = null + Auth.init() + val token = Auth.token() + Timber.d("Auth token: $token") + withContext(Dispatchers.IO) { + requestReader = httpRequest.json( + "${API_URL}/api/v1?from=$from&amount=$amount&lang=$language", + headers = Headers.of(mapOf("Authorization" to "Bearer $token")) + ) + } + withContext(Dispatchers.Default) { + JsonReader(requestReader!!).use { reader -> + reader.beginArray { + while (reader.hasNext()) { + newsData.postValue(klaxon.parse(reader)) + } } } } + } catch (e: Throwable) { + Timber.w(e, "Exception while populating data") + withContext(Dispatchers.Main) { + newsData.value = NewsData( + hasError = true, + id = "", + discoverDate = Date(), + title = "", + text = "", + url = "" + ) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/javinator9889/handwashingreminder/collections/NewsInformation.kt b/app/src/main/java/com/javinator9889/handwashingreminder/collections/NewsInformation.kt index aaac9a0..02e26bd 100644 --- a/app/src/main/java/com/javinator9889/handwashingreminder/collections/NewsInformation.kt +++ b/app/src/main/java/com/javinator9889/handwashingreminder/collections/NewsInformation.kt @@ -35,7 +35,9 @@ data class NewsData( val url: String, @KlaxonElements val elements: Elements? = null, - val website: Website? = null + val website: Website? = null, + @Json(ignored = true) + val hasError: Boolean = false ) : Parcelable { constructor(parcel: Parcel) : this( parcel.readString()!!, @@ -44,7 +46,8 @@ data class NewsData( parcel.readString()!!, parcel.readString()!!, parcel.readParcelable(Elements::class.java.classLoader), - parcel.readParcelable(Website::class.java.classLoader) + parcel.readParcelable(Website::class.java.classLoader), + parcel.readInt() == 1 ) override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -55,18 +58,15 @@ data class NewsData( parcel.writeString(url) parcel.writeParcelable(elements, flags) parcel.writeParcelable(website, flags) + parcel.writeInt(if (hasError) 1 else 0) } override fun describeContents() = 0 companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): NewsData { - return NewsData(parcel) - } + override fun createFromParcel(parcel: Parcel) = NewsData(parcel) - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun newArray(size: Int) = arrayOfNulls(size) } } diff --git a/app/src/main/res/layout/loading_recycler_view.xml b/app/src/main/res/layout/loading_recycler_view.xml index 44e8cf6..82161bb 100644 --- a/app/src/main/res/layout/loading_recycler_view.xml +++ b/app/src/main/res/layout/loading_recycler_view.xml @@ -1,8 +1,8 @@ - + + + + + + +