Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining a RecyclerView's onCLickListener in an Activity

A RecyclerView is different from a ListView because it doesn't offer an onItemCLickListener class to handle click events.

This can be tackled if not a lot is happening behind the scenes when an item is clicked, by defining an onClickListener in the ViewHolder.

What if the text or whatever that has to be passed to the next Activity doesnt really exist in the views that the ViewHolder has access to, but is rather a part of the Activity which has the RecyclerView?

In that case, the onClickListener must be implemented inside the activity so that the text can be forwarded. It is possible.

  1. One way is to add an Invisible View holding that text, and then doing what has been done before; implementing onClickListener in the Adapter.

  2. Pass that text, somehow, to the Adapter.

How can "2." be implemented?

like image 551
code Avatar asked Mar 13 '16 12:03

code


People also ask

How to add onclicklistener to recyclerview in Java?

1. We will need a listener interface. 2. In your ViewHolder class in your RecyclerView adapter, implement View.OnClickListener, bind the listener to the view. In the onClick method, call the onClick method of the interface OnItemClickListener.

What is the difference between onbindviewholder and setonclicklistener in recyclerview?

However, in RecyclerView the onBindViewHolder gets called every time the ViewHolder is bound and the setOnClickListener will be triggered too. Therefore, setting a click listener in onCreateViewHolder which invokes only when a ViewHolder gets created is preferable.

Is it possible to set a click listener in recyclerview?

However, in RecyclerView the onBindViewHolder gets called every time the ViewHolder is bound and the setOnClickListener will be triggered too. Therefore, setting a click listener in onCreateViewHolder which invokes only when a ViewHolder gets created is preferable. Here is a diagram of the implementation. A diagram of the implementation.

How to make a recyclerview responsive with onclick ()?

Update the ViewHolder to take in onClick () as a parameter. In the initializer, call setOnClickListener {} on the itemView. That’s it! Your RecyclerView is now responsive so time to get your click on! Happy coding! The full code sample including onClick () can be found here.


2 Answers

See the example below to create RecyclerView OnClick.

Example Code:

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

public interface OnItemClickListener {
    void onItemClick(ContentItem item);
}

private final List<ContentItem> items;
private final OnItemClickListener listener;

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
    this.items = items;
    this.listener = listener;
}

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
    return new ViewHolder(v);
}

@Override public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(items.get(position), listener);
}

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

static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView name;
    private ImageView image;

    public ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.name);
        image = (ImageView) itemView.findViewById(R.id.image);
    }

    public void bind(final ContentItem item, final OnItemClickListener listener) {
        name.setText(item.name);
        Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }
}
}

And Use RecyclerView Adapter using below code:

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
    Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));

See Set a click listener to a RecyclerView

Hope it helped you.

like image 169
pRaNaY Avatar answered Oct 31 '22 17:10

pRaNaY


Write a public function in your activity like:

public void onClickCalled(String anyValue) {
    // Call another acitivty here and pass some arguments to it.
}

Now in your adapter's onClick funciton

@Override
public void onClick(View view) {
    ((YouActivityClass) context).onClickCalled("your argument here");
}
like image 28
Adnan Amjad Avatar answered Oct 31 '22 19:10

Adnan Amjad