-1

I need to get the clicked item position in Android RecyclerView which is created in a fragment. Since recyclerview doesn't have any listener like listview, i searched and find some methods on the internet. Some doesn't worked and some doesn't provided the position value. Then i used my own refined code from examples i saw and it worked after spending a whole day. Now my problem is that i need to know any drawbacks of this including performance issues. or even better ways of doing this(if it is possible).

also can someone help me to reuse this code for multiple recyclerview in same project

RecyclerButtonClick.java

public class RecyclerButtonClick implements View.OnClickListener {
    YourFragment yourFragment=new YourFragment();
    public int pos;

    public RecyclerButtonClick(int position){
        this.pos=position;
    }
    @Override
    public void onClick(View v) {
        yourFragment.recyclerButtonClicked(pos);
    }
}

Now that is set we can write what to do in a function in the Fragment java file. It is then called by creating and instance of the Fragment.

public void recyclerButtonClicked(int position) {
    ...
    //position will have the index value of the rows in RecyclerView.
    ...
}

RecyclerButtonClick class is called in setOnClickListener in the onBindViewHolder() of the RecycleViewAdapter

public void onBindViewHolder(MyViewHolder holder, int position) {
    ...
    holder.YOUR_BUTTON.setOnClickListener(new RecyclerButtonClick(position));
    ...
}

help much appreciated

update on this github link if you want. https://github.com/abhinanduN/Android--RecyclerView-onClick-Listener/blob/master/README.md

abhndv
  • 209
  • 4
  • 13
  • 1
    why did you create that class instead of an interface, a commonly used method that you surely came across during your search? – Tim Nov 27 '18 at 16:09
  • 1
    btw your code will not work because you create a new fragment to call the click method on instead of propagating it to an existing fragment – Tim Nov 27 '18 at 16:10
  • this Question already answered , refer this [click](https://stackoverflow.com/a/44152237/8265484) – Mayur Dabhi Nov 28 '18 at 05:11
  • @TimCastelijns it did work though. – abhndv Nov 28 '18 at 08:20
  • it might compile, but it won't work. At least not based on what you're showing here – Tim Nov 28 '18 at 08:25

2 Answers2

0

You can do something like this.if you want to get click event out side of the class you can use interface.

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

public RecyclerViewAdapter() {
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    return null;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

}

@Override
public int getItemCount() {
    return 0;
}

public class RRecyclerViewHolder extends RecyclerView.ViewHolder implements View

        .OnClickListener {
    public RRecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
    }

    @Override
    public void onClick(View v) {
        int selectPosition = getAdapterPosition();
    }
}

}

madu_dev
  • 87
  • 5
0

RecyclerView don’t have a setOnItemClickListener as ListView had. If you want to get he clicked item position in Android RecyclerView which is created in a fragment, follow the following e.g :

  1. OnFragement.java which contains recyclerview in fragment :

    public class OneFragment extends Fragment {

    RecyclerView recyclerView;

    String arr[]={"Apple","Banana","Mango","Orange"};

    public static OneFragment newInstance() {

        Bundle args = new Bundle();

        OneFragment fragment = new OneFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_one,null);

        recyclerView=view.findViewById(R.id.recyclerview);

        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getActivity());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);


        recyclerView.setLayoutManager(linearLayoutManager);

        MyAdapter myAdapter=new MyAdapter(getActivity(),arr);

        recyclerView.setAdapter(myAdapter);

        return view;
    }
  1. In your custom adapter do following :

    public class MyAdapter extends RecyclerView.Adapter {
    Context context;
    String array[];

    LayoutInflater layoutInflater;

    public MyAdapter(FragmentActivity activity, String[] arr) {
        context=activity;
        array=arr;

        layoutInflater=LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view=layoutInflater.inflate(R.layout.recycler_row,null);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder myHolder, final int i) {
          myHolder.tvName.setText(array[i]);

          //to get position after clicked on button or any UI component on row
          myHolder.btnBuy.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  Toast.makeText(context,"You have clicked item "+array[i]+" at "+i+"th position",Toast.LENGTH_SHORT).show();
              }
          });

          //to get position after clicked on one itemview or row
          myHolder.itemView.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                   Toast.makeText(context,"You have clicked item at "+i+"th position",Toast.LENGTH_SHORT).show();
               }
          });
    }

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

    class MyHolder extends RecyclerView.ViewHolder
    {
        TextView tvName;
        Button btnBuy;

        public MyHolder(@NonNull View itemView) {
            super(itemView);

            tvName=itemView.findViewById(R.id.tv_fruit);
            btnBuy=itemView.findViewById(R.id.btn_buy);

        }
    }