Question: I'm developing a chat application. There are chatrooms and inside these rooms there are messages. When a user clicks on the chatroom I want to go to another activity where messages are displayed. 

In my adapter class, I have this `onclick()` method written in `onBindViewHolder` where I would normally make an intent along with the data I need. Something like this:

```
@Override
public void onBindViewHolder(@NonNull ChatRoomAdapter.ChatRoomViewHolder holder, final int position) {
    holder.mRoomTitle.setText(mChatRooms.get(position).getTitle());
    holder.mRoomDescription.setText(mChatRooms.get(position).getDescription());

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(this, NextActivity.java);
            intent.putExtra("test", mChatRooms.get(position).getTitle());
        }
    });
}

```

But I'm trying the MVP architecture design and I want to pass `roomTitle` to the Interactor/presenter class of my next activity. How can I achieve this?

Answer: 
In RecyclerView adapter you need to pass a onItemClickListener in the adapter.

Refer to the Google's MVP sample - > <https://github.com/googlesamples/android-architecture/tree/todo-mvp/>

Especially refer the TaskItemListener in TaskFragment. They are doing the same thing what you are trying to achieve. In this they open Task details (new activity) from List of tasks(recyclervView).

```
/**
 * Listener for clicks on tasks in the ListView.
 */
TaskItemListener mItemListener = new TaskItemListener() {
    @Override
    public void onTaskClick(Task clickedTask) {
        mPresenter.openTaskDetails(clickedTask);
    }

    @Override
    public void onCompleteTaskClick(Task completedTask) {
        mPresenter.completeTask(completedTask);
    }

    @Override
    public void onActivateTaskClick(Task activatedTask) {
        mPresenter.activateTask(activatedTask);
    }
};

```

And then pass it to adapter of Recycler view 

```
mListAdapter = new TasksAdapter(new ArrayList<Task>(0), mItemListener);

```

And on item click 

```
rowView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mItemListener.onTaskClick(task);
            }
        });

```
The adapter is only responsible for binding the view and the data together. Your business logic should go into the controller class which is your Activity or Fragment containing the RecyclerView. This way you can reuse it for any other Activity, and it also makes debugging/maintaining a lot easier since you know that your logic code is in one place.

But how do you link both together? It's simply done by implementing a callback interface and passing it to your adapter. A callback interface could be something like this:

```
interface OnClickCallback{
    void onClick(String title);
}

```

Just add a member variable to your adapter class called mCallback for example and affect a reference to it through the adapter constructor or through a setter method.
You can either make your Activity implement this interface and pass itself as the reference or you can instantiate it in an object and pass it instead.

Then just write this:

```
holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mCallback.onClick(mChatRooms.get(position).getTitle());
    }
});

```

The onClick method should create an intent to your new Activity with an extra containing the title. In your new Activity's onCreate method, you can retrieve the title value by using:

```
String title = getIntent().getStringExtra(YOUR_TITLE_KEY_HERE);

```