0

In my fragment class

    public class ReceiveFragment extends Fragment implements ReceiverRecyclerViewAdapter.OnItemClick {

btnGenAddress.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {


                    linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
                    linearLayoutGenAddress.setVisibility(View.GONE);

                recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,this);

                recyclerViewCardContainer.setAdapter(recyclerViewAdapter);



            }
        });

@Override
    public void onClick(String value) {

    }

and in the ReceiverRecyclerViewAdapter class i have create one interface and now when i write in the fragment recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,this); } it gives the complie time error when i use "this" parameter.

and my ReceiverRecyclerViewAdapter class

    public class ReceiverRecyclerViewAdapter extends RecyclerView.Adapter<ReceiverRecyclerViewAdapter.ViewHolder>{
     private OnItemClick mCallback;


    public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){

            SubjectValues = SubjectValues1;
            EmailValues2 = SubjectValues2;

            context = context1;
            this.mCallback = listener;
        }

  public interface OnItemClick {
        void onClick(String value);
    }

  itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();

                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        String clickedDataItem = SubjectValues[pos];
                       Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
                        mCallback.onClick(clickedDataItem);
                    }
                }
            });
    }
Gyan S Awasthi
  • 237
  • 6
  • 14

3 Answers3

3

You're passing 4 parameters from the fragment but your constructor is expecting 3. So you need to add Context as your first parameter in the adapter.

UPDATE:

You are passing this instance inside an anonymous class which is OnClickListener which does not implement the interface. So instead of this, pass ReceiveFragment.this, this way you are referencing your fragment which implements the interface:

recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails, ReceiveFragment.this);
riadrifai
  • 1,108
  • 2
  • 13
  • 26
2

The issue is because when you pass this from OnClickListener, it is passing an instance of on click and not that interface. You can initialize your interface in your fragment like below code and pass that in the adapter.

OnItemClick onitemClick = (OnItemClick) this;

btnGenAddress.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


                linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
                linearLayoutGenAddress.setVisibility(View.GONE);

            recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,onitemClick);

            recyclerViewCardContainer.setAdapter(recyclerViewAdapter);
        }
    });


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

   private OnItemClick mCallback;

    public ReceiverRecyclerViewAdapter(Context context, String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){

        SubjectValues = SubjectValues1;
        EmailValues2 = SubjectValues2;

        this.context = context;
        this.mCallback = listener;
    } 

 public interface OnItemClick {
        void onClick(String value);
    }

  itemView.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    // get position
                    int pos = getAdapterPosition();

                    // check if item still exists
                    if(pos != RecyclerView.NO_POSITION){
                        String clickedDataItem = SubjectValues[pos];
                       Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
                        mCallback.onClick(clickedDataItem);
                    }
                }
            });
    }
D.J
  • 1,439
  • 1
  • 12
  • 23
Samir Bhatt
  • 3,041
  • 2
  • 25
  • 39
1

Try this:

In adapter :

Write public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener)

In fragment :

  1. Make a object : OnItemClick onItemClick;

  2. In constructor : this.OnItemClick = onItemClick;

  3. Pass this object in adapter.

In activity :

Implement this listner.

Vidhi Dave
  • 5,614
  • 2
  • 33
  • 55
  • noting to do with the issue op is facing `ReceiverRecyclerViewAdapter(String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener)` The constructor has 3 params but while passing you have 4 `(getActivity(),subjects, emails,this);` – Raghunandan Nov 23 '17 at 09:16
  • @Raghunandan Before down vote please check the answer. It will work perfect – Vidhi Dave Nov 23 '17 at 09:19