在MVP结构中哪个类负责保存列表项以及如何通知数据更改

Sia*_*oli 6 java mvp android code-cleanup android-adapter

我试图重构我的一个活动类来实现mvp(使用mvp mosby库).我有一个RecyclerView,在这个视图中有一些项目在运行时会对它们进行一些更改.例如,我做了一些I/O操作并改变了一行.

我认为将我的项目保留在演示者课程中会更好; 这是什么最好的做法?将此保留在1)演示者或2)活动中或3)仅保留适配器中的视图相关项和演示者中的所有其他项.

活动现在直接保留项目并更改活动中的项目行,然后通知适配器.是不是更好地在适配器中移动所有这一行并通知适配器类中的适配器?例如,我想要一些row.where的更改图标,哪个类负责?适配器?活动?现在我想在适配器中实现它:

changeItemIcon(int position, int iconRes){
    mImages.get(position).setICon(iconRes);
    notifyItemChanged(position);
}
Run Code Online (Sandbox Code Playgroud)

我在活动上调用此方法并从演示者调用活动方法.

好吗?这样做的最佳做法是什么?

UPDATE

我也发现这个问题(使用RecyclerView适配器更新数据的最佳方法),使用适配器方法更改项目.但修改呢?我需要继续参考我活动中的项目吗?

soc*_*qwe 6

例如,我想要一些row.where的更改图标,哪个类负责?适配器?活动?

我知道这听起来有点奇怪,但更改元素始终是"业务逻辑"的责任,即使只是"图标".

工作流程应如下(单向数据流):

  1. 查看显示,告诉演示者加载项目列表
  2. Presenter从"业务逻辑"加载项目并将自己注册为观察者/监听者/回调(无论你想要什么称呼它)
  3. Presenter接收结果并告诉视图显示项目列表(通过RecyclerView和相应的适配器).

到目前为止,你已经实现了我想,现在它到了你想要改变一个项目的地步.

  1. 用户单击RecyclerView中的项目,然后触发该项目以更改此项目的图标.因此View应该调用:presenter.changeItem()
  2. 在这种情况下,Presenter就是中间人,并将调用"业务逻辑层"来告诉该项应该更改为新状态(图标已更改).
  3. "业务逻辑层"将更改模型状态(更改项目图标),然后将通知其观察者/听众模型已更改.
  4. 由于Presenter仍然在观察/收听业务逻辑层(请参阅第2点),因此将向Presenter通知一个新的(更新的)项目列表(见第6点),其中包含已更改图标的更新项目.
  5. 与第3点类似.Presenter将告诉视图显示新的(更新的)项目列表(通过RecyclerView和相应的适配器).

您是否看到了单向数据流?这非常重要.不变性FTW.