If you’ve used a RecyclerView, you may know that they don’t have a setOnItemClickListener as ListView had, so we have to create our own way to do it.
There are many ways to achieve this, but I will show you the way I usually do it. My mechanism consists of passing the listener as a parameter to the constructor and then assign it when I bind the data to the view in onBindViewHolder.
You’ll first need an interface that specifies listener’s behavior. In this example, there is a data class called Book, so the click will return an item of that type:
public interface OnItemClickListener {
void onItemClick(Book book);
}
The constructor will receive an object that implements this interface, along with the items to be rendered:
public class BookAdapter extends RecyclerView.Adapter<BookAdapter.MyViewHolder> {
private List<Book> bookList;
private OnItemClickListener listener;
public BookAdapter(List<Book> bookList, OnItemClickListener listener) {
this.bookList = bookList;
this.listener = listener;
}
Now, in onBindViewHolder the ViewHolderwill receive the constructor in the custom bind method:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.bind(bookList.get(position), listener);
}
This is how this bind method looks:
public void bind(final Book item, final OnItemClickListener listener) {
authorName.setText(item.getAuthorName());
bookName.setText(item.getBookName());
imageView.setImageResource(item.getImageResource());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(item);
}
});
}
Use it whenever you need it by creating a new adapter and the listener that will implement the behaviour when an item is clicked. A simple example:
//setting custum onItemClickListener
recyclerView.setAdapter(new BookAdapter(bookList,new BookAdapter.OnItemClickListener(){
@Override
public void onItemClick(Book book){
Toast.makeText(getApplicationContext(), book.getBookName()+" "+" book is Clicked", Toast.LENGTH_LONG).show();
}
}));
Take a look at the whole code of this adapter.
package com.example.lenovo.recyclerview.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.lenovo.recyclerview.R;
import com.example.lenovo.recyclerview.model.Book;
import java.util.List;
public class BookAdapter extends RecyclerView.Adapter<BookAdapter.MyViewHolder> {
private List<Book> bookList;
private OnItemClickListener listener;
public BookAdapter(List<Book> bookList, OnItemClickListener listener) {
this.bookList = bookList;
this.listener = listener;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView authorName, bookName;
public ImageView imageView;
public MyViewHolder(View view) {
super(view);
authorName = (TextView) view.findViewById(R.id.author_name);
bookName = (TextView) view.findViewById(R.id.book_name);
imageView = (ImageView) view.findViewById(R.id.img_book);
}
public void bind(final Book item, final OnItemClickListener listener) {
authorName.setText(item.getAuthorName());
bookName.setText(item.getBookName());
imageView.setImageResource(item.getImageResource());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(item);
}
});
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.book_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.bind(bookList.get(position), listener);
}
@Override
public int getItemCount() {
return bookList.size();
}
public interface OnItemClickListener {
void onItemClick(Book book);
}
}

So if i have a RecyclerView list can we open different activities for EACH item from the list? For example: Sports, Food, Drinks . I clicked on Sport=> Sport activity ; Food=> other activity with different layout to.
Can you show a example in Kotlin?
Thanks.
Yes this is possible , we create a post on this soon.