ViewPager2 fetching data from API doesn't work properly

72 views Asked by At

@AndroidEntryPoint class MoviesFragment : Fragment() {

private lateinit var binding: FragmentMoviesBinding

@Inject
lateinit var sliderAdapter: SliderAdapter

@Inject
lateinit var upcomingMoviesAdapter: UpcomingMoviesAdapter

@Inject
lateinit var topRatedMoviesAdapter: TopRatedMoviesAdapter


private val viewModel: MoviesViewModel by viewModels()

@Inject
lateinit var apiRepository: ApiRepository

@Inject
lateinit var popularMoviesAdapter: PopularMoviesAdapter

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?,
): View {
    binding= FragmentMoviesBinding.inflate(layoutInflater,container,false)
    return binding.root


}

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

    binding.apply {

        lifecycleScope.launch {
            viewModel.popularMovieList.collect{
                popularMoviesAdapter.submitData(it)
            }
        }
        popularMoviesAdapter.setOnItemClickListener {
            val direction = MoviesFragmentDirections.actionMoviesFragmentToMovieDetailsFragment(it.id,it.poster_path)
            findNavController().navigate(direction)
        }

        popularRecyclerView.apply {
            layoutManager = LinearLayoutManager(requireContext(),
                LinearLayoutManager.HORIZONTAL, false)
            adapter = popularMoviesAdapter
        }

        lifecycleScope.launch {
            popularMoviesAdapter.loadStateFlow.collect{
                val state = it.refresh
                popularProgressBar.isVisible = state is LoadState.Loading
            }
        }

        lifecycleScope.launch {
            viewModel.topRatedMovieList.collect{
                topRatedMoviesAdapter.submitData(it)
            }
        }

        topRatedMoviesAdapter.setOnItemClickListener {
            val direction = MoviesFragmentDirections.actionMoviesFragmentToMovieDetailsFragment(it.id,it.poster_path)
            findNavController().navigate(direction)
        }

        topRatedRecyclerView.apply {
            layoutManager = LinearLayoutManager(requireContext(),
                LinearLayoutManager.HORIZONTAL, false)
            adapter = topRatedMoviesAdapter
        }
        lifecycleScope.launch {
            topRatedMoviesAdapter.loadStateFlow.collect{
                val state = it.refresh
                topRatedProgressBar.isVisible = state is LoadState.Loading
            }
        }

        lifecycleScope.launch {
            viewModel.upcomingMovieList.collect{
                upcomingMoviesAdapter.submitData(it)
            }
        }

        upcomingMoviesAdapter.setOnItemClickListener {
            val direction = MoviesFragmentDirections.actionMoviesFragmentToMovieDetailsFragment(it.id,it.poster_path)
            findNavController().navigate(direction)
        }

        upcomingRecyclerView.apply {
            layoutManager = LinearLayoutManager(requireContext(),
                LinearLayoutManager.HORIZONTAL, false)
            adapter = upcomingMoviesAdapter
        }

        lifecycleScope.launch {
            upcomingMoviesAdapter.loadStateFlow.collect{
                val state = it.refresh
                upcomingProgressBar.isVisible = state is LoadState.Loading
            }
        }

        lifecycleScope.launch {
            viewModel.nowPlayingMovieList.collect {
                sliderAdapter.submitData(it)
            }
        }

        sliderAdapter.setOnItemClickListener {
            val direction = MoviesFragmentDirections.actionMoviesFragmentToMovieDetailsFragment(it.id,it.poster_path)
            findNavController().navigate(direction)
        }

        viewpagerSlider.apply {
            setViewPager()
            adapter = sliderAdapter
        }
    }

}
private fun setViewPager() {
    binding.viewpagerSlider.clipToPadding = false
    binding.viewpagerSlider.clipChildren = false
    binding.viewpagerSlider.offscreenPageLimit = 3
    binding.viewpagerSlider.getChildAt(0).overScrollMode = RecyclerView.OVER_SCROLL_NEVER

    binding.viewpagerSlider.adapter = sliderAdapter

    val middlePosition = Int.MAX_VALUE / 2
    binding.viewpagerSlider.setCurrentItem(middlePosition, false)

    binding.viewpagerSlider.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageSelected(position: Int) {
            super.onPageSelected(position)
            val itemCount = sliderAdapter.itemCount
            if (position == 0) {
                binding.viewpagerSlider.setCurrentItem(itemCount / 2, false)
            } else if (position == itemCount - 1) {
                binding.viewpagerSlider.setCurrentItem(itemCount / 2, false)
            }
        }
    })

    val compositePageTransformer = CompositePageTransformer()
    compositePageTransformer.addTransformer(MarginPageTransformer(25))
    compositePageTransformer.addTransformer { page, position ->
        val r: Float = 1 - abs(position)
        page.scaleY = 0.90f + r * 0.10f
    }
    binding.viewpagerSlider.setPageTransformer(compositePageTransformer)

}

}

This is my source code; I'm trying to fetch some images from my API. It's barely working right now. The problem is when I open my fragment I don't see anything all. I see is my background but after I move to another fragment and come back here I can see my viewpager is working fine. What is the problem. How to fix it?

0

There are 0 answers