@Override
    public View getView(int position, View convertView, ViewGroup parent) {

      if (convertView == null) {
        convertView = LayoutInflater.from(getActivity()).inflate(R.layout.review_card, null);
      }

      ReviewData reviewData = getItem(position);

      // Author name
      TextView authorTextView = (TextView) convertView.findViewById(R.id.review_author);
      authorTextView.setText(reviewData.getAuthor());

      // Review content
      final TextView reviewContentTextView =
          (TextView) convertView.findViewById(R.id.review_content);
      reviewContentTextView.setText(reviewData.getContent());

      // Read more text
      final TextView readMoreTextView = (TextView) convertView.findViewById(R.id.read_more_action);

      // TextView.getLineCount() will return 0 after setText(), have to check getLineCount() in
      // TextView.post(Runnable)
      reviewContentTextView.post(
          new Runnable() {
            @Override
            public void run() {
              // If the review content is longer than a number of lines, show read-more TextView
              if (reviewContentTextView.getLineCount()
                  > getResources().getInteger(R.integer.review_default_line_num)) {
                readMoreTextView.setOnClickListener(
                    new View.OnClickListener() {
                      @Override
                      public void onClick(View view) {

                        // Scroll down animation of review
                        ObjectAnimator animation =
                            ObjectAnimator.ofInt(
                                reviewContentTextView,
                                "maxLines",
                                reviewContentTextView.getLineCount());
                        animation.setDuration(1000).start();
                        readMoreTextView.setVisibility(View.GONE);
                      }
                    });
              } else { // If the review content short enough, read-more feature is no needed, hide
                // it
                readMoreTextView.setVisibility(View.GONE);
              }
            }
          });

      return convertView;
    }
    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {

      View view;

      if (convertView == null) {
        LayoutInflater inflater = getActivity().getLayoutInflater();
        view = inflater.inflate(R.layout.trailer_gridview_item, viewGroup, false);

      } else {
        view = convertView;
      }

      TrailerData trailerData = mTrailerDataList.get(i);
      final String youtubeId = trailerData.getKey();

      // The thumbnail image of the trailer on Youtube
      ImageView thumbnailImage = (ImageView) view.findViewById(R.id.trailer_thumbnail_image);
      String thumbnailImageUrl = MovieUtils.getTrailerYoutubeImageUrl(youtubeId);
      Glide.with(getActivity()).load(thumbnailImageUrl).into(thumbnailImage);

      // The title of trailer textView
      TextView trailerTitle = (TextView) view.findViewById(R.id.trailer_thumbnail_title);
      trailerTitle.setText(trailerData.getName());

      // Click event to create the intent to show the trailer using the youtube url
      String youtubeVideoUrl = MovieUtils.getTrailerYoutubeUrl(youtubeId);
      view.setTag(youtubeVideoUrl);
      view.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse((String) view.getTag()));
              startActivity(intent);
            }
          });

      return view;
    }
  /**
   * Create the component views of the detail page
   *
   * @param container
   * @return the view of the detail page
   */
  public View getDetailPageView(ViewGroup container) {
    final View view =
        getActivity().getLayoutInflater().inflate(R.layout.movie_detail_page, container, false);

    int movieId = getArguments().getInt(MovieDetailActivity.MOVIE_ID);
    Result movieData = FetchedMovieData.getInstance().getMovieDataByMovieId(movieId);

    if (movieData != null) {

      // The title TextView
      TextView titleTextView = (TextView) view.findViewById(R.id.movie_title_detail);
      titleTextView.setText(movieData.getOriginalTitle());

      // Rating bar
      RatingBar ratingBar = (RatingBar) view.findViewById(R.id.rating_bar);
      ratingBar.setRating(movieData.getVoteAverage());

      // The poster ImageView
      ImageView posterImageView = (ImageView) view.findViewById(R.id.poster_detail);
      String imageUrl =
          MovieUtils.getPosterUrl(
              getResources().getInteger(R.integer.thumbnail_poster_width),
              movieData.getPosterPath());
      Glide.with(getActivity())
          .load(imageUrl)
          .diskCacheStrategy(DiskCacheStrategy.ALL)
          .into(posterImageView);

      // The release date TextView
      TextView dateReleaseTextView = (TextView) view.findViewById(R.id.movie_release_date_detail);
      Date releaseDate;
      try {
        releaseDate = new SimpleDateFormat("yyyy-MM-dd").parse(movieData.getReleaseDate());
        String formattedDateString = new SimpleDateFormat("MMM yyy").format(releaseDate);
        dateReleaseTextView.setText(formattedDateString);
      } catch (ParseException e) {
        e.printStackTrace();
      }

      // The description TextView
      TextView descriptionTextView = (TextView) view.findViewById(R.id.movie_description_detail);
      descriptionTextView.setText(movieData.getOverview());

      /** The trailer part */
      // Request the trailer data by querying through themoviedb.org API
      Call<TrailerDatas> call =
          MyMovieDbApi.getInstance().getMoviesTrailerDatas(movieId, Constants.MOVIEDB_API_KEY);
      call.enqueue(
          new Callback<TrailerDatas>() {
            @Override
            public void onResponse(Response<TrailerDatas> response, Retrofit retrofit) {
              TrailerDatas data = response.body();
              List<TrailerData> trailerDataList = data.getTrailerDatas();

              FullHeightGridView trailerGridView =
                  (FullHeightGridView) view.findViewById(R.id.gridview_trailer);
              trailerGridView.setAdapter(new TrailerAdapter(trailerDataList));
            }

            @Override
            public void onFailure(Throwable t) {}
          });
    }

    return view;
  }