在MVP模式中,适配器应该持有模型还是将模型保存在Presenter中并让适配器引用它?

5

目前我让适配器(adapter)引用了其中所有的模型(models)。但是,让Presenter仅持有这些模型,而适配器只需引用它们,这样会更好吗?

例如:

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

private Presenter presenter;

public Adapter(Presenter presenter){
    this. presenter = presenter;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    Model m = presenter.getModels().get(position);
    // bind model to view holder
}

@Override
public int getItemCount() {
    return presenter.getModels().size();
}


}

这样,当Presenter获取更多的模型时,只需在获取后调用getAdapter().notfiyDataSetChanged();即可。

2个回答

5
您可以选择两种方式。有些人认为将适配器视为视图的一部分,并尽可能使其愚笨,但是如果您做得正确,让适配器持有数据肯定会有好处。
例如,我使用一个泛型的抽象基础适配器来保存数据对象列表以驱动recyclerview。它提供了所有标准的CRUD操作(添加、更新、删除、移动等)用于列表。这些方法还处理通知适配器的更改,因此我的客户端代码不必担心。它只需将对象交给适配器或告诉它删除/更改一个对象,而适配器会处理其余部分。
这里的重大优点是在与recyclerviews交互的各个角色之间减少了大量重复的CRUD操作和数据集更改通知的样板代码。如果您有超过一个或两个屏幕使用recyclerviews,则这种节省会快速累积,使其比盲目遵循口号更有益。

啊,我明白了。你有抽象适配器的例子吗?如果我不采用抽象适配器的方式,你认为我应该让Presenter持有Models吗? - Sree

4

通常适配器被认为是视图的实现细节。

Presenter不应该知道View的实现细节。

适配器的工作是持有一个项目数组并将其发布到视图中。适配器不应该知道Presenter、模型、其他视图等信息。

我理解的适配器的数据流:

Model -> Presenter -> View -> Adapter-> ItemView

控制流相反,最好跳过适配器。

欢迎在项目问题中提出问题。


如果Adapter和Presenter之间需要通信,我该怎么办?例如,如果有一个图片列表,用户喜欢一张照片。我是否需要在View中实现一个方法作为中间人?所有View要做的就是调用 getPresenter().likePhoto(); - Sree
在这种情况下,我将在 View 中使用 lambda 表达式来传递 ItemView 的 onClick 事件给 Presenter。 - konmik
嗯...你有例子吗?我不是很熟悉lambda...但即使使用lambda,如果点赞失败(设备离线或服务器出错)会发生什么?我们需要取消点赞该照片。 - Sree
https://github.com/konmik/nucleus/blob/master/nucleus-example-real-life/src/main/java/nucleus/example/ui/main/MainFragment.java#L66 - konmik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接