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?