```package me.ismoil.rickandmorty.ui.screens.chara...
# android
i
Copy code
package me.ismoil.rickandmorty.ui.screens.characters

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.View
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.paging.LoadState
import androidx.paging.LoadStateAdapter
import by.kirich1409.viewbindingdelegate.viewBinding
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import me.ismoil.rickandmorty.R
import me.ismoil.rickandmorty.common.Resource
import me.ismoil.rickandmorty.databinding.FragmentCharacterBinding
import me.ismoil.rickandmorty.databinding.ItemLayoutCharacterBinding
import me.ismoil.rickandmorty.domain.model.Character
import me.ismoil.rickandmorty.utils.PagingLoadStateAdapter
import javax.inject.Inject

@AndroidEntryPoint
class CharacterFragment : Fragment(R.layout.fragment_character) {

    private val binding by viewBinding(FragmentCharacterBinding::bind)
    private val viewModel: CharacterViewModel by viewModels()
    private val navController by lazy(LazyThreadSafetyMode.NONE) { findNavController() }
    @Inject lateinit var charactersAdapter: CharactersAdapter

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            setUpRV()
            observers()
    }

    private fun observers() {
        lifecycleScope.launch {
            viewModel.charactersFlow.collect{ result ->
                when (result) {
                    is Resource.Success -> {
                        result.data?.collectLatest {
                            charactersAdapter.submitData(it)
                        }
                    }
                    is Resource.Error -> {
                        Toast.makeText(context, result.message ?: "", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    }

    private fun setUpRV() {
        binding.rv.adapter = charactersAdapter.withLoadStateHeaderAndFooter(
            header = PagingLoadStateAdapter(this::retry),
            footer = PagingLoadStateAdapter(this::retry),
        )

        binding.rv.apply {
            postponeEnterTransition()
            viewTreeObserver.addOnPreDrawListener {
                startPostponedEnterTransition()
                true
            }
        }

        charactersAdapter.setOnClickListener { character ->
            openDetailsPage(character)
        }

        lifecycleScope.launch {
            charactersAdapter.loadStateFlow.collectLatest { loadState ->
                binding.progressBar.root.isVisible = loadState.refresh is LoadState.Loading
            }
        }
    }


    private fun retry() {
        charactersAdapter.retry()
    }

    private fun openDetailsPage(character: Character) {
        navController.navigate(CharacterFragmentDirections.actionCharacterFragmentToCharacterDetailsFragment(character))
    }

    override fun onDestroyView() {
//        charactersAdapter = null
        super.onDestroyView()
    }


}
😶 3
🧵 5