Skip to content

Instantly share code, notes, and snippets.

@MamboBryan
Created May 21, 2022 04:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MamboBryan/4c1d8feb403b23f92ea6435cc35eca97 to your computer and use it in GitHub Desktop.
Save MamboBryan/4c1d8feb403b23f92ea6435cc35eca97 to your computer and use it in GitHub Desktop.
The view
package com.mambobryan.samba.ui.characters
import android.os.Bundle
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.paging.LoadState
import com.mambobryan.samba.R
import com.mambobryan.samba.databinding.FragmentTemplateBinding
import com.mambobryan.samba.ui.adapters.CharacterAdapter
import com.mambobryan.samba.ui.adapters.ItemLoadStateAdapter
import com.zhuinden.fragmentviewbindingdelegatekt.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
class RemoteOnlyFragment : Fragment(R.layout.fragment_template) {
private val binding by viewBinding(FragmentTemplateBinding::bind)
private val viewModel: CharactersViewModel by activityViewModels()
@Inject
lateinit var characterAdapter: CharacterAdapter
@Inject
lateinit var footer: ItemLoadStateAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
lifecycleScope.launch {
characterAdapter.loadStateFlow.collectLatest { loadState ->
Timber.i("Load state => $loadState")
val isListEmpty =
loadState.refresh is LoadState.NotLoading && characterAdapter.itemCount == 0
// show empty list
binding.layoutState.stateEmpty.isVisible = isListEmpty
// Only show the list if refresh succeeds.
binding.layoutState.stateContent.isVisible = !isListEmpty
// Show loading spinner during initial load or refresh.
binding.layoutState.stateLoading.isVisible =
loadState.source.refresh is LoadState.Loading
// Show the retry state if initial load or refresh fails.
binding.layoutState.stateError.isVisible =
loadState.source.refresh is LoadState.Error
// Show any error, regardless of whether it came from RemoteMediator or PagingSource
val errorState = loadState.source.append as? LoadState.Error
?: loadState.source.prepend as? LoadState.Error
?: loadState.append as? LoadState.Error
?: loadState.prepend as? LoadState.Error
errorState?.let {
binding.layoutState.tvError.text = "\uD83D\uDE28 Wooops ${it.error}"
}
}
}
lifecycleScope.launch {
viewModel.articles.collectLatest {
characterAdapter.submitData(it)
}
}
}
private fun initViews() {
binding.toolbar.title = "Remote Only"
binding.layoutState.tvError.text = "Couldn't Load Characters"
binding.layoutState.tvEmpty.text = "No Character Found"
binding.layoutState.buttonRetry.setOnClickListener { characterAdapter.refresh() }
footer.onRetryClicked { characterAdapter.retry() }
characterAdapter.withLoadStateFooter(footer = footer)
binding.layoutState.recyclerView.apply {
setHasFixedSize(true)
adapter = characterAdapter
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment