How to send Data when cardview clicked to detail content

fiki firmansyah :

I try to passing data from cardview when clicked to DetailFragment, in this case I try to use interface in my adapter, but I get an error a null object reference in mOnItemClickListener.onClick(i).

I try to passing data from cardview when clicked to DetailFragment, in this case I try to use interface in my adapter.

I want to passing data to DetailMoviesFragment Class.

this is my CardviewMovieAdapter Class


    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.bumptech.glide.Glide;
    import com.bumptech.glide.request.RequestOptions;

    import java.util.ArrayList;

    public class CardviewMovieAdapter extends RecyclerView.Adapter<CardviewMovieAdapter.CardViewViewHolder> {
        private ArrayList<Movie> listMovie;
        Context context;
        OnItemClickListener mOnItemClickListener;

        public void setListMovie(ArrayList<Movie> listMovie) {
            this.listMovie = listMovie;
        }

        public ArrayList<Movie> getListMovie() {
            return listMovie;
        }


        public interface OnItemClickListener {
            void onClick(int position);
        }
        public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
            this.mOnItemClickListener = mItemClickListener;
        }

        public CardviewMovieAdapter(ArrayList<Movie> listMovie, Context context) {
            this.listMovie = listMovie;
            this.context = context;
        }

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

        @Override
        public void onBindViewHolder(@NonNull final CardviewMovieAdapter.CardViewViewHolder cardViewViewHolder, final int i) {
            final Movie movie = listMovie.get(i);
            Glide.with(cardViewViewHolder.itemView.getContext())
                    .load(movie.getImageMovie())
                    .apply(new RequestOptions().override(350, 550))
                    .into(cardViewViewHolder.imgPhoto);

            cardViewViewHolder.tvTitle.setText(movie.getTitleMovie());
            cardViewViewHolder.tvDesc.setText(movie.getDescription());

            cardViewViewHolder.btnDetail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(cardViewViewHolder.itemView.getContext(), "Detail "+
                            listMovie.get(cardViewViewHolder.getAdapterPosition()).getTitleMovie(), Toast.LENGTH_SHORT).show();

                }
            });

            cardViewViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(cardViewViewHolder.itemView.getContext(), "Kamu Memilih "+movie.getTitleMovie(), Toast.LENGTH_SHORT).show();
                    mOnItemClickListener.onClick(i);
                }
            });

    //        cardViewViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
    //            @Override
    //            public void onClick(View v) {
    //                Toast.makeText(cardViewViewHolder.itemView.getContext(), "Kamu Memilih "+movie.getTitleMovie(), Toast.LENGTH_SHORT).show();
    //            }
    //        });
        }


        @Override
        public int getItemCount() {

            return listMovie.size();
        }

        public class CardViewViewHolder extends RecyclerView.ViewHolder {
            ImageView imgPhoto;
            TextView tvTitle, tvDesc;
            Button btnDetail;

            public CardViewViewHolder(@NonNull View itemView) {
                super(itemView);
                    imgPhoto = itemView.findViewById(R.id.img_item_photo);
                    tvTitle = itemView.findViewById(R.id.tv_title);
                    tvDesc = itemView.findViewById(R.id.tv_desc);
                    btnDetail = itemView.findViewById(R.id.btn_detail);
            }
        }
    }

This is my MoviesFragment Class


    import android.content.Intent;
    import android.content.res.TypedArray;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.widget.CardView;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.ListView;

    import java.util.ArrayList;


    /**
     * A simple {@link Fragment} subclass.
     */
    public class MoviesFragment extends Fragment implements View.OnClickListener{
        private RecyclerView rvMovie;
        private String[] dataMovieTitle;
        private String[] dataDescription;
        private TypedArray dataPhoto;
        private ArrayList<Movie> movies;
        Button btnDetail;
        private CardviewMovieAdapter adapter;

        View view;
        final static String KEY = "KEY";
        public MoviesFragment() {
            // Required empty public constructor
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            view = inflater.inflate(R.layout.fragment_movies, container, false);
            //adapter = new CardviewMovieAdapter(movies,getContext());
            rvMovie = view.findViewById(R.id.rv_movies);
            prepare();
            addItem();
            showRecyclerCardView();
            adapter = new CardviewMovieAdapter(movies, getContext());

            adapter.setOnItemClickListener(new CardviewMovieAdapter.OnItemClickListener() {
                @Override
                public void onClick(int position) {
                    final Movie movie = movies.get(position);
                    DetailMoviesFragment detailMoviesFragment = new DetailMoviesFragment();
    //                Bundle mBundle = new Bundle();
    //                mBundle.putString(detailMoviesFragment.EXTRA_TITLE, movie.getTitleMovie());
    //                mBundle.putString(detailMoviesFragment.EXTRA_DESCRIPTION, movie.getDescription());
    //                mBundle.putInt(detailMoviesFragment.EXTRA_PHOTO, movie.getImageMovie());
    //                detailMoviesFragment.setArguments(mBundle);

                    MoviesFragment.newInstance(movie.getTitleMovie(), movie.getDescription(), movie.getImageMovie());

                    FragmentManager mFragmentManager = getFragmentManager();
                    if (mFragmentManager!= null) {
                        FragmentTransaction mFragmentTransaction = mFragmentManager.beginTransaction();
                        mFragmentTransaction.replace(R.id.containterFragment, detailMoviesFragment, DetailMoviesFragment.class.getSimpleName());
                        mFragmentTransaction.addToBackStack(null);
                        mFragmentTransaction.commit();
                    }
                }
            });

            return view;
        }

        public static MoviesFragment newInstance(String title, String desc, int image) {
            MoviesFragment moviesFragment = new MoviesFragment();
            Bundle args = new Bundle();
            args.putInt("image", image);
            args.putString("title", title);
            args.putString("desc", desc);
            moviesFragment.setArguments(args);
            return moviesFragment;
        }

        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
        }
        private void showRecyclerCardView(){
            rvMovie.setLayoutManager(new LinearLayoutManager(getActivity()));
            CardviewMovieAdapter adapter = new CardviewMovieAdapter(movies,getActivity());
            rvMovie.setAdapter(adapter);
        }
        private void prepare() {
            dataMovieTitle = getResources().getStringArray(R.array.data_movie_name);
            dataDescription = getResources().getStringArray(R.array.data_desc_movie);
            dataPhoto = getResources().obtainTypedArray(R.array.data_photo_movie);
        }
        private void addItem(){
            movies = new ArrayList<>();
            for (int i=0; i < dataMovieTitle.length; i++){
                Movie movie = new Movie();
                movie.setImageMovie(dataPhoto.getResourceId(i, -1));
                movie.setTitleMovie(dataMovieTitle[i]);
                movie.setDescription(dataDescription[i]);
                movies.add(movie);
            }
        }

        @Override
        public void onClick(View v) {
            if(v.getId() == R.id.card_view){

            }
        }
    }

and this is DetailMoviesActivity Class


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

public class DetailMovieActivity extends AppCompatActivity {
    Movie movie;
    TextView tvTitle, tvDesc;
    ImageView ivMovie;
    Button btnDetail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail_movie);
        initView();
    }

    private void initView() {
        movie = (Movie) getIntent().getSerializableExtra("informasi");

        String judul = movie.getTitleMovie();
        String desc = movie.getDescription();
        int img = movie.getImageMovie();

        tvTitle.setText(judul);
        tvDesc.setText(desc);
        Picasso.get().load(img).into(ivMovie);
    }
}
Deni Rohimat :

You can try with delete the setOnItemClickListener and call intent from cardViewViewHolder.itemView.setOnClickListener

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=135488&siteId=1