0

I`m creating a movie app for learning purposes. I am have problem with clicking an cardview to direct me to another activity from fragment.

Currently, I have the fragment which displays movies from api with retrofit. the adapter to handle processing and an interface to for click event.

This is the adapter

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.ViewHolder> {

    private String IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500/";
    private List<Movie> movieList;
    private OnRecyclerViewItemClickListener onRecyclerViewItemClickListener;

    public MoviesAdapter(List<Movie> movieList){
        this.movieList = movieList;
    }

    @NonNull
    @Override
    public MoviesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.movie_card, viewGroup, false);
        return new MoviesAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MoviesAdapter.ViewHolder movieViewHolder, int i) {
        movieViewHolder.bind(movieList.get(i));
    }

    @Override
    public int getItemCount() {
        return movieList.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView poster;
        TextView movietitle, moviereleasedate, movierating;
        LinearLayout linearLayout;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            poster = itemView.findViewById(R.id.cardview_image);
            movietitle = itemView.findViewById(R.id.cardview_movietitle);
            moviereleasedate = itemView.findViewById(R.id.cardview_releasedate);
            movierating = itemView.findViewById(R.id.cardview_rating);
            linearLayout = itemView.findViewById(R.id.movie_cardview_linearlayout);
        }
        public void bind(Movie movie){
            movietitle.setText(movie.getTitle());
            moviereleasedate.setText(movie.getReleaseDate().split("-")[0]);
            movierating.setText(String.valueOf(movie.getRating()));
            Picasso.get()
                    .load(IMAGE_BASE_URL+movie.getPosterPath())
                    .resize(96,128)
                    .placeholder(R.color.colorNotSelected)
                    .error(R.drawable.ic_launcher_foreground)
                    .into(poster);
            linearLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (onRecyclerViewItemClickListener != null)
                        onRecyclerViewItemClickListener.onItemClick(getAdapterPosition(),v);
                }
            });
        }
    }
    public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener onRecyclerViewItemClickListener){
        this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
    }
}

Below is interface for click

public interface OnRecyclerViewItemClickListener {
    void onItemClick(int adapterPosition, View view);
}

Below is fragment class

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_now_playing, container, false);

        //Initialization of layout
        ll = view.findViewById(R.id.movie_cardview_linearlayout);
        recyclerView = view.findViewById(R.id.recyclerView_now_playing_fragment);
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(linearLayoutManager);

        //Getting retrofit client
        final Service service = Client.getClient().create(Service.class);
        Call<MoviesResponse> call = service.getNowPlayingMovies(BuildConfig.THE_MOVIE_DB_API_TOKEN);

        //getting data
        call.enqueue(new Callback<MoviesResponse>() {
            @Override
            public void onResponse(Call<MoviesResponse> call, Response<MoviesResponse> response) {
                if (response.isSuccessful()){
                    List<Movie> movies = response.body().getMovies();
                    if (movies.size()>0){
                        final MoviesAdapter moviesAdapter = new MoviesAdapter(movies);
                        // Click does not work
                        // If I did it from activity I just put context of activity as an argument
                        moviesAdapter.setOnRecyclerViewItemClickListener(//);
                        recyclerView.setAdapter(moviesAdapter);
                    }
                }
            }

            @Override
            public void onFailure(Call<MoviesResponse> call, Throwable t) {
                Log.e(TAG, "onFailure: ", t);
            }
        });

        return view;
    }



    @Override
    public void onItemClick(int adapterPosition, View view) {
        switch (view.getId()){
            case R.id.main_cardview:
                Toast.makeText(getActivity(), "Card View Clicked", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

I also click directly from cardview in fragment but it faild

It should give at least a toast as a test.

Thank you.

1 Answers1

0

Please try this.

@Override
        public void onItemClick(int adapterPosition, View view) {
            switch (view.getId()){
                case R.id.movie_cardview_linearlayout:
                    Toast.makeText(getActivity(), "Card View Clicked", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
Mohit patel
  • 296
  • 1
  • 8
  • I tried but failed, I think the problem is: moviesAdapter.setOnRecyclerViewItemClickListener(//); if I do the same line on main activity I put MainActivity.this as argument but whenever I implement the context it fails. I tried also getActivity() and view.getContext() but the same – Harun Sabban Jun 15 '19 at 13:06
  • I think so. You can try itemview.setonclicklistener. and pass the activity in the constructor of the adapter. and then your toast will show once you add the code in the click event – Mohit patel Jun 15 '19 at 13:17