passing values from recycler adapter to fragment in android

11,414

Solution 1

make interface to handle click event into recyclerview .. used below code for handling click event.

onItemClickListner onItemClickListner;

public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);//pass your object types.
}
   @Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
    String data=mStringList.get(position); // if you pass object of class then create that class object.
    holder.textView.setText(data);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClickListner.onClick(data);
        }
    });
 }

then after when you bind adapter into RecyclerView call below code..

mRvData.setLayoutManager(new LinearLayoutManager(this));
mRvData.setAdapter(recyclerViewAdpater);
recyclerViewAdpater.notifyDataSetChanged();
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
    @Override
    public void onClick(String str) {
        Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
    }
});

Solution 2

Create an interface in your adapter

public interface OnItemClickListener {
  void onItemClicked(int position, Object object);
}

in your adapter call

Adapter adapter = new Adapter(context, list, new Adapter.OnItemClickListener() {
            @Override
            public void onItemClicked(int position, Object object) {
                  // Handle Object of list item here
            }
        });

on your adapter

private OnItemClickListener onItemClickListener; // Global scope 

in constructor call:

this.onItemClickListener = onItemClickListener;

on your item clicked event :

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      onItemClickListener.onItemClicked(position, _list.get(position));
    }
});

Solution 3

Please use an interface like below, pass it in the adapter's constructor, and than use it in your activity / Fragment

   public MyAdapter(Context context, List<Object> data, MyAdapterListener myAdapterListener) {
             this.context = context;
             this.data = data;
              this.myAdapterListener = myAdapterListener;
        }

        public interface MyAdapterListener {

    void onContainerClick(View view, int position); 
    }

     }

    public class ViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener {
        public LinearLayout container;

        public ImageView poster;

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

            container = (LinearLayout) v.findViewById(R.id.container);

            poster = (ImageView) v.findViewById(R.id.poster);

            container =setOnClickListener(this); /// this line must include
        }

        @Override
        public void onClick(View v) {
            int id = v.getId();

            if (id == R.id.container) {
               if (myAdapterListener != null) {
    myAdapterListener.onContainerClick(v,getAdapterPosition());
                }
            }
        }
    }

Use it like this in your fragment/Activity

mAdapter = new MyAdapter(getApplicationContext() , data, new MyAdapter.MyAdapterListener() {
                    @Override
                    public void onContainerClick(View v, int position) {
                        Log.d(TAG, "iconTextViewOnClick at position "+position);
                    }

                });
mRecycler.setAdapter(mAdapter);
Share:
11,414
Ajay Kulkarni
Author by

Ajay Kulkarni

#SOreadytohelp Rules Smash keyboard. Come up with beautiful products, no matter what happens I am nerdier than 97% of all people. Are you a nerd? Click here to take the Nerd Test, get nerdy images and jokes, and talk on the nerd forum! http://www.nerdtests.com/images/ft/nq/4fbf3d9fe6.gif https://akulkarni9.github.io/#/

Updated on July 14, 2022

Comments

  • Ajay Kulkarni
    Ajay Kulkarni almost 2 years

    I've a recycler adapter where I've added setOnClickListener for items in adapter. Code is as given below:

    @Override
        public void onBindViewHolder(final FiltersAdapter.MyViewHolder holder, final int position) {
            holder.mOrganizer.setText(filtersList.get(position));
            holder.mLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    try {
                        //Log.e("message","ONclick FIlter");
                        if (holder.mOrganizerCheck.isChecked()){
                            holder.mOrganizerCheck.setChecked(false);
                        }else {
                            holder.mOrganizerCheck.setChecked(true);
                            int pos = holder.getAdapterPosition();
    
                            filtersList.get(pos);
    
                            /*Bundle bundle = new Bundle();
                            bundle.putInt(pos, );*/
    
                            Log.d(TAG, "onClick: " +filtersList);
                            Log.d(TAG, "onClick of position: " +pos);
    
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });  
    

    And here is fragment code which deals with getting values from adapter to fragment.

    private void initView() {
            mrvFilterBySender = (RecyclerView) mFilterView.findViewById(R.id.rvFilterBySender);
            mFiltersAdapter = new FiltersAdapter(getActivity(), mListOrganizer);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
            mrvFilterBySender.setLayoutManager(mLayoutManager);
    
            mrvFilterBySender.setAdapter(mFiltersAdapter);
            mFiltersAdapter.notifyDataSetChanged();
    
            mrvFilterBySender.setAdapter(mFiltersAdapter);
            mrvFilterBySender.setRecyclerListener(new RecyclerView.RecyclerListener() {
                @Override
                public void onViewRecycled(RecyclerView.ViewHolder holder) {
                    holder.getAdapterPosition();
                }
            });
    
        }  
    

    I'm trying to pass pos and value having that pos from adapter to fragment. But my code isn't working. How can I fix it?

  • DragonFire
    DragonFire about 5 years
    This is working thanks... for a more clearer explanation
  • Deep Patel
    Deep Patel about 5 years
    Thanks you so much!! Happy Coding!!