我试图重构我的一个 Activity 类来实现 mvp(使用 mvp mosby 库)。我有一个 RecyclerView,在这个 View 中有一些项目在运行时应用了一些更改。例如,我执行一些 I/O 操作并更改一行。
我认为最好将我的项目保留在演示者类中;这方面的最佳做法是什么?将其保留在 1)presenter 或 2)activity 或 3)only keep view related item in adapter and all other item in presenter.
Activity 现在直接保留项目并更改 Activity 中的项目行,然后通知适配器。在适配器类中移动所有这一行并在适配器类中通知适配器不是更好吗?例如,我想更改某些行的图标。在哪里以及哪个类负责?适配器? Activity ?现在我想在适配器中这样实现它:
changeItemIcon(int position, int iconRes){
mImages.get(position).setICon(iconRes);
notifyItemChanged(position);
}
我在 Activity 上调用此方法并从演示者调用 Activity 方法。
好吃吗?执行此操作的最佳做法是什么?
更新
我还发现这个问题 ( Best way to update data with a RecyclerView adapter ) 使用适配器方法更改项目。但是修改呢?我需要在我的 Activity 中保留对项目的引用吗?
最佳答案
for example i want change icon of some row.where and which class is responsible for that? adapter? activity?
我知道这听起来有点奇怪,但更改元素始终是您的“业务逻辑”的责任,即使只是“图标”也是如此。
工作流程应该如下(单向数据流):
- 查看出现,告诉演示者加载项目列表
- Presenter 从“业务逻辑”加载项目并将自己注册为 观察者/监听者/回调(随便你怎么称呼)
- Presenter 收到结果并告诉 View 显示列表 项目(通过 RecyclerView 和相应的适配器)。
到目前为止,我猜你已经实现了,现在到了你想要更改项目的地步。
- 用户点击 RecyclerView 中的一个项目,然后应该触发更改该项目的图标。因此 View 应该调用:
presenter.changeItem()
- 在这种情况下,Presenter 只是中间人,它将调用“业务逻辑层”来告知应将项目更改为新状态(图标已更改)。
- “业务逻辑层”将更改模型状态(更改项目图标),然后通知其观察者/听众模型已更改。
- 由于 Presenter 仍在观察/监听业务逻辑层(参见第 2 点),Presenter 将收到通知(参见第 6 点)一个新的(更新的)项目列表,其中包含图标已更改的更新项目.
- 类似于第 3 点。Presenter 将告诉 View 显示新的(更新的)项目列表(通过 RecyclerView 和相应的适配器)。
你看到单向数据流了吗?这是非常重要的。不变性 FTW。
关于java - 在 MVP 结构中,哪个类负责保留列表项以及如何通知此中的数据更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37652424/