-6

I'm using a recycleView in a fragment and I'd like to add itemClickListener to it. Here's my code:

MyAdapter.java:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    private String[] mDataset;

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        public CardView mCardView;
        public TextView mTextView;
        public MyViewHolder(View v){
            super(v);

            mCardView = (CardView) v.findViewById(R.id.card_view);
            mTextView = (TextView) v.findViewById(R.id.tv_text);

        }

    }

    public MyAdapter(String[] myDataset){
        mDataset = myDataset;
    }

    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position){
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() { return mDataset.length; }

}

and this is when i called it in fragment, Staf3Fragment.java

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link Staf3Fragment.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link Staf3Fragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class Staf3Fragment extends Fragment {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    public Staf3Fragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment Staf3Fragment.
     */
    // TODO: Rename and change types and number of parameters
    public static Staf3Fragment newInstance(String param1, String param2) {
        Staf3Fragment fragment = new Staf3Fragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }




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


        RecyclerView rv = (RecyclerView) view.findViewById(R.id.rv_recycler_view);
        rv.setHasFixedSize(true);
        MyAdapter adapter = new MyAdapter(new String[]{"Upacara Bendera", "Info Aplikasi"});
        rv.setAdapter(adapter);

        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);

        return view;
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            //throw new RuntimeException(context.toString()
                    //+ " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

how to make on item click different use,i mean when click on item 1 it will go to another activity and if item 2 will go to another activity

please help me thanks

=====================================================================

card_item.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="68dp" >

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_margin="10dp"
        android:layout_height="62dp"
        card_view:cardCornerRadius="4dp"
        card_view:elevation="14dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/iv_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:src="@drawable/abc_btn_radio_material"></ImageView>

            <TextView
                android:id="@+id/tv_text"

                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@+id/iv_image"
                android:layout_marginLeft="10dp"
                android:layout_centerVertical="true"
                android:gravity="center"
                android:textSize="20dp"></TextView>

        </RelativeLayout>
    </android.support.v7.widget.CardView>

</RelativeLayout>

fragment_staf3.xml

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.network.poeja.belibis.Staf3Fragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</FrameLayout>
onexf
  • 3,674
  • 3
  • 22
  • 36
Bekti Puja
  • 31
  • 1
  • 11

5 Answers5

5

Create a custom interface class like this

public interface ClickInterface {

    public void recyclerviewOnClick(int position);
}

implement it in your Fragment and initialize the interface

YourFragment extends Fragment implements ClickInterface{

private ClickInterface listner;

------- Your oncreateView   --------
listner=this; //Now pass this in your adapter
    }

In your adapter constructor get this listner like this

public MyAdapter(String[] myDataset,ClickInterface listner){
        this.mDataset = myDataset;
        this.listner=listner;
    }

and at last in your ViewHolder

public class MyViewHolder extends RecyclerView.ViewHolder{
        public CardView mCardView;
        public TextView mTextView;
        public MyViewHolder(View v){
            super(v);

            mCardView = (CardView) v.findViewById(R.id.card_view);
            mTextView = (TextView) v.findViewById(R.id.tv_text);

mTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    listner.recyclerviewOnClick(getAdapterPosition());

                }
            });
        }
    }

Now you will get the position in your fragment in

public void recyclerviewOnClick(int position){
// Here you will get the position
}
AbhayBohra
  • 2,047
  • 24
  • 36
1

You can try ButterKnife Lib @onClick() way.

    @OnClick(R.id.btnCheck)
    public void onCheck() {
        Log.d("ViewHolder", "position ->" + getAdapterPosition());
    }
RKRK
  • 1,284
  • 5
  • 14
  • 18
mbakgun
  • 75
  • 5
0

You can do that by below code;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private String[] mDataset;

public static class MyViewHolder extends RecyclerView.ViewHolder{
    public CardView mCardView;
    public TextView mTextView;

    public View mainView;

    public MyViewHolder(View v){
        super(v);

        mainView = v;

        mCardView = (CardView) v.findViewById(R.id.card_view);
        mTextView = (TextView) v.findViewById(R.id.tv_text);

    }

}

public MyAdapter(String[] myDataset){
    mDataset = myDataset;
}

@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false);
    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position){
    holder.mTextView.setText(mDataset[position]);

    //And below code will execute item click event for RecyclerView's item....

    holder.mainView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            //Do your code here for item click ....

            }
        });

}

@Override
public int getItemCount() { return mDataset.length; }

 }
Vishal Vaishnav
  • 3,346
  • 3
  • 26
  • 57
0

Add your clickListenr to the viewHolder like this

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public CardView mCardView;
public TextView mTextView;

public MyViewHolder(View v) {
    super(v);

    mCardView = (CardView) v.findViewById(R.id.card_view);
    mTextView = (TextView) v.findViewById(R.id.tv_text);
    mCardView.setOnClickListener(this);
    mTextView.setOnClickListener(this);

}

@Override
public void onClick(View view) {

    switch (view.getId()) {
        case R.id.card_view:

            //Action when card_view is clicked

            break;
        case R.id.tv_text:

            //Action when tv_text is clicked

            break;
        default:
            break;
    }
  }
}
Sharath kumar
  • 4,064
  • 1
  • 14
  • 20
0

You can set click listener inside adapter class and also you can use RecyclerView click listener class. If you use RecyclerView custom click than you have to use this class and use this listener in activity or fragment wherever you need. this is the class and you have to keep in util package.

public class RecyclerOnClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

public interface OnItemClickListener {
    public void onItemClick(View view, int position);

    public void onLongItemClick(View view, int position);
}

GestureDetector mGestureDetector;

public RecyclerOnClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }

@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}

}

and after this, you can use this class by calling a method like this, here is the code.

private void recycleClick() {

    product_recycleview.addOnItemTouchListener(
            new RecyclerOnClickListener(ProductListActivity.this, product_recycleview, new RecyclerOnClickListener.OnItemClickListener() {                   @Override
               public void onItemClick(View view, int position) {
                 Intent intent = new Intent(ProductListActivity.this, ProductDetailsActivity.class);                       intent.putExtra("data", detailList.get(position));
                   startActivity(intent);
                   overridePendingTransition(R.anim.slide_in_left, R.anim.fade_out);
               }

               @Override
                public void onLongItemClick(View view, int position) {

                }
            }));

}

you can send data by intent to next activity and another solution is this, you can implement click listener on items of ViewHolder class and you can manage click inside adapter class like this, below code

 itemRowHolder.lnr_layout_package.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, SinglePackageShowOnlyActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            intent.putExtra("list", dataList.get(i).getSingleItemModels());
            intent.putExtra("title", model.getType());
            intent.putExtra("image", model.getImages());
            intent.putExtra("service_name", service_title);
            intent.putExtra("pack_name",package_title);


            mContext.getApplicationContext().startActivity(intent);

        }
    });

remember if you can set click on an individual item then you have to prefer to click in adapter class and if you can set individual click listener inside an adapter then you have to put it in onBindView class