Recyclerview Onclick

RecyclerView onClick

As the API's have radically changed, It wouldn't surprise me if you were to create an OnClickListener for each item. It isn't that much of a hassle though. In your implementation of RecyclerView.Adapter<MyViewHolder>, you should have:

private final OnClickListener mOnClickListener = new MyOnClickListener();

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}

The onClick method:

@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}

RecyclerView Item Click Listener the Right Way

You need to check this tutorial here for better understanding on how you can achieve the behaviour that you want.

In case of handling the onClickListener from your activity you need to work based on a callback implementation with an interface. Pass the interface from the activity to your adapter and then call the callback function from your adapter when some items are clicked.

Here's a sample implementation from the tutorial.

Let us first have the interface.

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

You need to modify your adapter to take the listener as the parameter like the one stated below.

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

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

Now in your onBindViewHolder method, set the click listener.

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

public void bind(final ContentItem item, final OnItemClickListener listener) {
...
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}

Now setting the adapter in your RecyclerView.

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

So the whole adapter code looks like the following.

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);
}
});
}
}
}

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}
}
}
}
}

How to implement OnClickListener in RecyclerView?

Your approach of using an Index variable is right, add getter and setter method for the index. But you can't set the onClickListener on the adapter. Instead, set the listener on the card view like this ->

holder.card.setOnItemClickListener(new ClickListener() {
@Override
public void onItemClick(int position, View v) {
index = position;
notifyDataSetChanged();
}
});

Add this method inside your adapter class ->

public int getSelectedIndex(){
return this.index; }

After that, from your Activity, inside your NEXT button's onClickListener do the following thing,

    btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(profileAdapter.getSelectedIndex() == 1)
//goto activity of your desire and so on
}
});

How to add Onclick listener to recycler view

You can handle this using two ways

1). Gesture touch
https://www.google.co.in/amp/sapandiwakar.in/recycler-view-item-click-handler/amp/

2).Using interface in adapter
https://antonioleiva.com/recyclerview-listener/

I suggest second way using interface

How to use interface for recycleritemclick

public class RecycleViewAdapter extends 
RecyclerView.Adapter<RecycleViewHolder> {// Recyclerview will extend to
private List<FileName> fileNames;
private Context context;

//declare interface
private OnItemClicked onClick;

//make interface like this
public interface OnItemClicked {
void onItemClick(int position);
}

public RecycleViewAdapter(Context context,List<FileName> fileNames) {
this.context = context;
this.fileNames = fileNames;
}

Now assign click to interface

@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
//............//
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClick.onItemClick(position);
}
});
}

At the end of the adapter class up from finishing bracket make one method to assign itemclick to interface

public void setOnClick(OnItemClicked onClick){
this.onClick=onClick;
}

In MainActivity.java
Bind the item click with adapter

public class MainActivity extends Activity implements OnItemClicked {

private RecyclerView mRecyclerView;
private CityAdapter mAdapter;
private List<City> cities;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city);

mRecyclerView = (RecyclerView)findViewById(R.id.list);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

mAdapter = new CityAdapter(cities, R.layout.row_city, this);
mRecyclerView.setAdapter(mAdapter);

mAdapter.setOnClick(MainActivity.this); // Bind the listener
}

@Override
public void onItemClick(int position) {
// The onClick implementation of the RecyclerView item click
//ur intent code here
}
}

For Kotlin code please refer How to handle recyclerview item click in kotlin?

More queries? comment.

Implement Onclick in Recyclerview

Use this code in your MainActivity where you are using recyclerview. You can find the full example here

mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
// Do Something
}

@Override
public void onDeleteClick(int position) {
// Do Something
}
});

Nested RecyclerView OnclickListener

You can simple make one more interface and call it in nested adapter's onclick method.

So it will pass that data from adapter to the activity when you click any adapter items.

Like this :

1. Create an interface for getting the child recyclerview item click in the activity or fragment.

First, you need to change your child adapter's click listener from this

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

to this :

public interface OnItemClickListener {
void onItemClick(int childPosition);
}

then pass the adapter position of child recyclerview instead of string value.

Now, make a new interface to get both the parent and child item clicks in the activity or fragment.

public interface RvItemClickListener {
void onChildItemClick(int parentPosition, int childPosition, String item);
}

2. Define the listener and call it on child item click in parent recyclerview adapter :

RvItemClickListener rvItemClickListener;

public void setRvItemClickListener(RvItemClickListener rvItemClickListener){
this.rvItemClickListener = rvItemClickListener;
}

3. Call it on child item click :

childRecyclerAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(int childPosition) {
String item = items.get(childPosition);
rvItemClickListener.onChildItemClick(getAdapterPosition(), childPosition, item);
}
});

4. The last step is to override the method in your activity or fragment as you do it normally :

@Override
public void onItemClick(int parentPosition, int childPosition, String item) {

}

I hope it's enough for you to understand what I am trying to say.

It's just an example. Do make changes as per your needs.

How to add onClickListener on images in recyclerView?

I'm Java Developer so I cannot code with Kotlin but I'll show you how to set OnClickListener on your imageView. For using OnclickListener on imageView no need for Glide Library.
Just add the below lines in your onBindViewHolder

holder.imageView.setOnClickListener(view -> {
Toast.makeText(context, "this is number: "+position+" Image Selected", Toast.LENGTH_SHORT).show();
// or your code for imageView
});

Your new code looks like the below:-

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// Array with urls
val url = urls[position]

//code for onClick on image
holder.imageView.setOnClickListener(view -> {
Toast.makeText(context, "this is number: "+position+" Image Selected", Toast.LENGTH_SHORT).show();
// or your code for imageView
});


Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.drawable.placeholder)
.into(holder.imageView)
}

Make sure to change JAVA to Kotlin in my code. If you any problem is causing, Let me know



Related Topics



Leave a reply



Submit