John
John

Reputation: 437

Passing data from one activity to interactor of another activity

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?

Upvotes: 0

Views: 303

Answers (3)

Elyes Mansour
Elyes Mansour

Reputation: 144

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

Upvotes: 0

TheAnkush
TheAnkush

Reputation: 915

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

Upvotes: 1

Pranav P
Pranav P

Reputation: 1815

Follow this article to know more about MVP.

You can do one thing that creates a method in the next activity's presenter

setRoomTitle(String roomTitle);

Whenever, you click and send intent and get in next Activity call that

mPresenter.setRoomTitle(roomTitle);

Is it make sense? So, you can sent your title or other data in next activity's presenter.

Let me know if you have more query then.

Thanks.

Happy coding :)

Upvotes: 0

Related Questions