How to Set Onclicklistener on Recyclerview Item in a Fragment

OnClickListener in RecyclerView in Fragment

add itemView.setOnClickListener(this); in adapter ViewHolder

Recyclerview onclick to open new fragment

First setup a click listener:

Set a click listener on the ViewHolder object.

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AracMarkaViewHolder {

var inflater = LayoutInflater.from(parent.context)
var arackategori = inflater.inflate(R.layout.arac_kategori, parent, false)

return AracMarkaViewHolder(arackategori).also {
arackategori.setOnClickListener { clickHandler.forwardClick(it) }
}
}

We setup a listener, where we invoke the function forwardClick(holder: AracMarkaViewHolder). We pass the current inflated view holder reference to it so that we can do any future operations on it.

Now setup an interface:

We create an interface because we want any click event to be handeled by the activity. Those events, in your case include, launching a new fragment.

interface ClickEventHandler {
fun forwardClick(holder: AracMarkaViewHolder)
}

Now in your adapter, setup the interface like this:

private val clickHandler: ClickEventHandler = context as ClickEventHandler 

Modify adapter class signature:

Now, we need to slightly modify adapter's constructor.

var MyAdapter = AracMarkaAdapter(araclarKategori, requireContext()) //We pass the activity's context. 

And your adapter class signature should look something like this:

 class AracMarkaAdapter(tumKategori: ArrayList<AracMarka>, context: Context) :
RecyclerView.Adapter<AracMarkaAdapter.AracMarkaViewHolder>() {
private val clickHandler: ClickEventHandler = context as ClickEventHandler
}

Implement the interface:

Now we implement the interface in the activity.

class MainActivity : AppCompatActivity(), ClickEventHandler  {
override fun forwardClick(holder: AracMarkaViewHolder) {
//Launch a new fragment here.
}
}

how to passing data when clicked on item fragment with recyclerview to activity

First create a new interface anywhere like below (ClickListener.java):

interface ClickListener {
void onClickData(String value);
}

Then add it in the Adapter as a constructor parameter.

Also there is no need for the Context parameter in the Adapter (at least I haven't found any context requirement.)

However if you need context in onBindViewHolder, you should use holder.itemView.getContext()

public class NettvAdapter extends RecyclerView.Adapter<NettvAdapter.MenuItemViewHolder> {
private final List<item_kenh> recyclerViewItems;
private listener ClickListener;


public NettvAdapter(List<item_kenh> recyclerViewItems, ClickListener listener) {
this.recyclerViewItems = recyclerViewItems;
this.listener = listener;
}

@Override
public NettvAdapter.MenuItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

View itemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_kenh, null);
return new MenuItemViewHolder(itemLayoutView);
}



@Override
public void onBindViewHolder(NettvAdapter.MenuItemViewHolder holder, final int position) {

final item_kenh fp = (item_kenh) recyclerViewItems.get(holder.getAdapterPosition());

//menuItemHolder.titles.setText(fp.getTitle());
// menuItemHolder.profile.setText(fp.getProfiles());
String url = fp.getUrl_images();
Picasso.get().load(url).into(holder.thumb);

holder.thumb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onClickData(fp.getUrl_images());
}
});
}


@Override
public int getItemCount() {
return recyclerViewItems.size();
}


public class MenuItemViewHolder extends RecyclerView.ViewHolder {
// public TextView titles;
public ImageView thumb;
// public TextView profile;
// public LinearLayout lineLayout;

MenuItemViewHolder(View itemLayoutView) {
super(itemLayoutView);

// titles = (TextView) itemLayoutView.findViewById(R.id.title);
thumb = (ImageView) itemLayoutView.findViewById(R.id.imageView);
//profile = (TextView) itemLayoutView.findViewById(R.id.profiles);
//lineLayout = (LinearLayout) itemLayoutView.findViewById(R.id.midlelayout);


}
}

Then implement ClickListener in your Fragment:

Tab1_Fragment extends Fragment implements ClickListener {

@Override
void onClickData(String clickedValue) {
Intent int_detail = new Intent(getContext(), PlayerActivity.class);
int_detail.putExtra("url_img", clickedValue);
getActivity().startActivity(int_detail);
}
}

And initialise your Adapter same as before:

mAdapter = new NettvAdapter(mRecyclerViewItems, this);

Different onClick for each and every Recyclerview item

You should use if condition in onBindViewHolder of your adpter class as bellow:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.item.setOnClickListener {
when (position) {
0 -> {
//navigate to first fragment}
}
1 -> {
//navigate to second fragment}
}
2 -> {
//navigate to third fragment}
}
3 -> {
//navigate to fourth fragment}
}
}
}
}


Related Topics



Leave a reply



Submit