t3nsa
t3nsa

Reputation: 850

RecyclerView doesn't load data initially

I made an app from which I get data from TMDB API, everything seems to work but when I start the app, it displays only hint text, after scrolling the View get's updated with the data from the API

This is how it looks before scrolling

Before scrolling

And this is how it looks after scrolling down a a bit enter image description here

This is how I implemented it:

HomeFragment.kt

class HomeFragment : Fragment() {

    private var _binding: FragmentHomeBinding? = null
    private lateinit var popularMovies: RecyclerView
    private lateinit var popularMoviesAdapter: MoviesAdapter

    private val binding get() = _binding!!
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val homeViewModel = ViewModelProvider(this)[HomeViewModel::class.java]

        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        popularMovies = binding.popularMovies
        popularMovies.layoutManager = LinearLayoutManager(context,LinearLayoutManager.VERTICAL,false)
        popularMoviesAdapter = MoviesAdapter(listOf())
        popularMovies.addItemDecoration(DividerItemDecoration(context,DividerItemDecoration.VERTICAL))
        popularMovies.adapter = popularMoviesAdapter

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

        MoviesRepository.getPopularMovies(page = 1,onSuccess = ::onPopularMoviesFetched,onError =  ::onError)
    }
    private fun onPopularMoviesFetched(movies: List<Movie>) {
        popularMoviesAdapter.updateMovies(movies)
    }
    private fun onError() {
        Toast.makeText(context, getString(R.string.error_fetch_movies), Toast.LENGTH_SHORT).show()
    }

MovieAdapter.kt

class MoviesAdapter(
    private var movies: List<Movie>
) : RecyclerView.Adapter<MoviesAdapter.MovieViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
        val view = LayoutInflater
            .from(parent.context)

        val binding = MovieItemBinding.inflate(view)
        return MovieViewHolder(binding)
    }

    override fun getItemCount(): Int = movies.size

    override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
        holder.bind(movies[position])
    }

    fun updateMovies(movies: List<Movie>) {
        this.movies = movies
        notifyDataSetChanged()
    }

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

        private val poster: ImageView = itemView.findViewById(R.id.item_movie_poster)

        fun bind(movie: Movie) {

            binding.movieTitle.text =movie.title
            binding.movieReleaseDate.text = movie.releaseDate

            binding.movieOverview.text = movie.overview
            binding.movieReleaseDate.text = movie.releaseDate
            Glide.with(itemView)
                .load("https://image.tmdb.org/t/p/w342${movie.posterPath}")
                .transform(CenterCrop())
                .into(poster)
        }
    }

Upvotes: 0

Views: 336

Answers (1)

Vikas
Vikas

Reputation: 468

make adapter initialization on onViewCreated instead of onCreateView

Upvotes: 1

Related Questions