androidandroid-recyclerviewcardviewclicklistener

Recyclerview + CardView OnClickListener


I'm using Recyclerview for my datalist in CardView, but I don't know how to make onClick in my data list. Can someone help me to solve this?

My code is:

HomeFragment.Java

public class HomeFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.activity_grid_layout, container, false);
            dataList = view.findViewById(R.id.dataList);
            titles = new ArrayList<>();
            images = new ArrayList<>();
            titles.add("Berita");
            titles.add("Customer Care");
            titles.add("Cabang Clipan");
            titles.add("Info Layanan");
            titles.add("Info Pembayaran");
            titles.add("Promo");
            titles.add("Syarat Kedit");
            titles.add("Simulasi Kredit");
            images.add(R.drawable.ic_article);
            images.add(R.drawable.ic_cs);
            images.add(R.drawable.ic_cbng_clipan);
            images.add(R.drawable.ic_simulation);
            adapter = new Adapter(getActivity(), titles, images);
            GridLayoutManager gridLayoutManager = new 
            GridLayoutManager(getActivity(), 4, GridLayoutManager.VERTICAL, false);
            dataList.setLayoutManager(gridLayoutManager);
            dataList.setHasFixedSize(true);
            dataList.setAdapter(adapter);
            return view;
        }
    }

I'm using Adapter for Recyclerview:

Adapter.Java

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    List<String> titles;
    List<Integer> images;
    Context ctx;
    LayoutInflater inflater;
    public Adapter(Context ctx, List<String> titles,List<Integer> images){
        this.titles = titles;
        this.images = images;
        this.inflater = LayoutInflater.from(ctx);
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.fragment_home,parent,false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        holder.gridIcon.setImageResource(images.get(position));
    }
    @Override
    public int getItemCount() {
        return titles.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        ImageView gridIcon;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.text_1);
            gridIcon = itemView.findViewById(R.id.image_1);
        itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(),"Click on " + getAdapterPosition(),Toast.LENGTH_LONG).show();
                    Intent i = new Intent(v.getContext(),SimulationActivity.class);
                    i.setFlags(i.FLAG_ACTIVITY_NEW_TASK);
                    v.getContext().startActivity(i);
                }
            });
        }
    }
}

I have edited my adapter for onClickListener Please help me to solve this.


Solution

  • You can add the OnClickListener to the root item of the ReyclerView row which is itemView in your example.

    You can do that optionally in the ViewHolder constructor or in onBindViewHolder method

    Here it's in the ViewHolder

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        ImageView gridIcon;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.text_1);
            gridIcon = itemView.findViewById(R.id.image_1);
            
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "My Item position: " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    

    And in the onBindViewHolder

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        holder.gridIcon.setImageResource(images.get(position));
        
        
        holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "My Item position: " + position, Toast.LENGTH_SHORT).show();
                }
            });
    
    }