ViewPager2 doesn't show my images how to solve it?

26 Views Asked by At
class SliderAdapter @Inject constructor() :
PagingDataAdapter<MovieListResponse.Result, SliderAdapter.ViewHolder>(differCallback) {
private lateinit var context: Context


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val binding =
        ItemSliderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    context = parent.context
    return ViewHolder(binding)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bind(getItem(position)!!)
    holder.setIsRecyclable(false)
}

inner class ViewHolder(private val binding: ItemSliderBinding) :
    RecyclerView.ViewHolder(binding.root) {


    fun bind(item: MovieListResponse.Result) {
        binding.apply {
            val photo= Constants.IMAGE_BASE_URL + item.poster_path
            image.load(photo){
                crossfade(true)
                placeholder(R.drawable.edittext_background)
                scale(Scale.FILL)
            }
            root.setOnClickListener {
                onItemClickListener?.let { it(item) }
            }
        }
    }
}

private var onItemClickListener: ((MovieListResponse.Result) -> Unit)? = null


fun setOnItemClickListener(listener: (MovieListResponse.Result) -> Unit) {
    onItemClickListener = listener
}

companion object {
    private val differCallback = object : DiffUtil.ItemCallback<MovieListResponse.Result>() {
        override fun areItemsTheSame(
            oldItem: MovieListResponse.Result,
            newItem: MovieListResponse.Result
        ): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(
            oldItem: MovieListResponse.Result,
            newItem: MovieListResponse.Result
        ): Boolean {
            return oldItem == newItem
        }
    }
} }


@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)
        }
    }

    setViewPager()

}
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)

}}

I am using ViewPager2 to show my images.I am fetching images from api and im using paging in my adapter. When i start my app i don't see any images in my viewpager but it's working when i click my items after i navigate to my fragment again i can see some of my images but not all of them i am not sure what is the problem. Can someone help me with that?

0

There are 0 best solutions below