【问题标题】:Passing data from one activity to interactor of another activity将数据从一个活动传递到另一个活动的交互器
【发布时间】:2019-06-21 14:22:02
【问题描述】:

我正在开发一个聊天应用程序。有聊天室,在这些房间里有消息。当用户单击聊天室时,我想转到另一个显示消息的活动。

在我的适配器类中,我在onBindViewHolder 中编写了这个onclick() 方法,我通常会在其中与我需要的数据一起制定意图。像这样的:

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

但我正在尝试 MVP 架构设计,我想将 roomTitle 传递给我下一个活动的交互者/演示者类。我怎样才能做到这一点?

【问题讨论】:

  • 你为什么使用这个适配器?你在recyclerview中展示了什么?消息?
  • recyclerview 用于显示聊天室。我想从聊天室转到带有聊天室标题的消息活动。

标签: android firebase


【解决方案1】:

在 RecyclerView 适配器中,您需要在适配器中传递一个 onItemClickListener。

参考谷歌的MVP示例->https://github.com/googlesamples/android-architecture/tree/todo-mvp/

特别是指TaskFragment中的TaskItemListener。他们正在做你想要达到的目标。在此,他们从任务列表(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);
    }
};

然后将其传递给Recycler视图的适配器

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

然后在项目上单击

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

【讨论】:

    【解决方案2】:

    关注此article 以了解有关 MVP 的更多信息。

    你可以做一件事,在下一个活动的演示者中创建一个方法

    setRoomTitle(String roomTitle);
    

    每当您单击并发送意图并进入下一个 Activity 调用时

    mPresenter.setRoomTitle(roomTitle);
    

    有意义吗?因此,您可以在下一个活动的演示者中发送您的标题或其他数据。

    如果您有更多疑问,请告诉我。

    谢谢。

    编码愉快:)

    【讨论】:

      【解决方案3】:

      适配器只负责将视图和数据绑定在一起。您的业​​务逻辑应该进入控制器类,即包含 RecyclerView 的 Activity 或 Fragment。通过这种方式,您可以将其重用于任何其他 Activity,并且由于您知道您的逻辑代码在一个地方,因此它还使调试/维护变得更加容易。

      但是如何将两者联系在一起呢?它只是通过实现一个回调接口并将其传递给您的适配器来完成。回调接口可能是这样的:

      interface OnClickCallback{
          void onClick(String title);
      }
      

      例如,只需向适配器类添加一个名为 mCallback 的成员变量,并通过适配器构造函数或通过 setter 方法影响对它的引用。 您可以让您的 Activity 实现此接口并将其自身作为引用传递,或者您可以在对象中实例化它并改为传递它。

      那就这样写吧:

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

      onClick 方法应该为您的新 Activity 创建一个意图,其中包含一个包含标题的额外内容。在新 Activity 的 onCreate 方法中,您可以使用以下方法检索标题值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        相关资源
        最近更新 更多