passing values from recycler adapter to fragment in android
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);
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, 2022Comments
-
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 thatpos
from adapter to fragment. But my code isn't working. How can I fix it? -
DragonFire about 5 yearsThis is working thanks... for a more clearer explanation
-
Deep Patel about 5 yearsThanks you so much!! Happy Coding!!