0

i am working with single activity and MVVM artitechture its have main activity for just launcher then there is the MainFragment from there we go to ViewPagerContainerFragment using navigation component and in that fragment i have viewpager2 setup with tablayout and in each fragment of viewpager2 there is recyclerview which need to load data from firebase so every thing working fine but the problem is when i click an item in recyclerview this open another fragment for detail info but then i come back i need to load all data back which look a little wired and some times recycler view positions chnaged so there is a way to retain viepager2 state if come back from detail fragment see code below for detail

ViewPager2Adapter.kt

class ViewPager2Adapter(viewPagerContainerFragment : ViewPagerContainerFragment)
: FragmentStateAdapter(viewPagerContainerFragment) {

    override fun getItemCount() = 8

    override fun createFragment(position: Int): Fragment = ItemsViewPagerFragment()

}

ItemsViewPagerFragment.kt

class ItemsViewPagerFragment : Fragment(), ItemsViewPagerFragmentListener{

    private val itemsViewPagerFragmentViewModel: ItemsViewPagerFragmentViewModel by viewModels()

    private lateinit var itemsAdapter: ItemsAdapter

    private val refreshing by lazy { itemsViewPagerFragmentViewModel.refreshing }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.itemsviewpager_fragment, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initSwipeRefreshLayout()
    }

    private fun initSwipeRefreshLayout() {

        refreshing.value = false

        refreshing.observe(viewLifecycleOwner) {
            swipeRefreshLayout.isRefreshing = it
        }

        swipeRefreshLayout.setOnRefreshListener {           
               refreshData()      
        }

    }

    override fun onResume() {
        super.onResume()
        getData()
    }

    private fun getData() {

        if (!::itemsAdapter.isInitialized) {
            refreshing.value = true
            initItemsAdapter()
        }

        showRecyclerView()

    }

    private fun initItemsAdapter() {

        itemsViewPagerFragmentViewModel.getItemsLiveData()

        itemsAdapter = ItemsAdapter(
            emptyList(),
            ItemsClickListener()
        )
    }

    private fun refreshData() {
        if (!::itemsAdapter .isInitialized) initItemsAdapter()
        else itemsViewPagerFragmentViewModel.getItemsLiveData()
    }

    private fun showRecyclerView() {
        if (isAdded) {

            recyclerView.apply {
                setHasFixedSize(true)
                layoutManager =
                    if (DeviceOrientationUtil.isLandscape(requireContext()))
                        StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
                    else LinearLayoutManager(context)

                adapter = itemsAdapter

                viewPagerFragmentViewModel.itemsLiveData.observe(viewLifecycleOwner) {

                        itemsAdapter.updateData(it)

                        refreshing.value = false
                    }

                }

            }

        }
    }

    private inner class ItemsClickListener : ItemsViewHolder.ItemsClickListener {
        override fun onItemClick(item: Item) {
            findNavController().navigate(R.id.action_itemsViewPagerFragment_to_itemDetailFragment)
        }
    }
}

ItemsViewPagerFragmentViewModel.kt

class ItemsViewPagerFragmentViewModel : ViewModel() {

    private val itemsRepository = ItemsRepository()

    val refreshing = MutableLiveData<Boolean>()

    lateinit var itemsLiveData: ItemsLiveData

    var isDataCached = false

    fun getItemsLiveData() {
        itemsLiveData = itemsRepository.getitemsLiveData()
    }

}
Burhan Khanzada
  • 945
  • 9
  • 27
  • That's a lot of code here. Please edit your question and isolate the problem, in that way you increase your chances of being helped. – Alex Mamo Oct 27 '20 at 14:09
  • https://stackoverflow.com/questions/59232880/my-fragments-keep-recreating-whenever-i-reclick-or-navigate-to-the-next-fragment – Wahdat Jan Oct 27 '20 at 14:10
  • Navigation component library does this, recreating fragments , Now you can do save view reference and re render the data – Wahdat Jan Oct 27 '20 at 14:11
  • Thanks @AlexMamo for your suggestion i thought that the more code help others to uderstand my problem better well i my working to shirk – Burhan Khanzada Oct 27 '20 at 14:15

0 Answers0