我目前正在使用MVP模式开发一个Android应用程序。
当我尝试开发一个Activity时,我应该使用ListView。所以我正在使用Adapter for ListView。但我听说适配器类似于MVP模式上的Presenter。
我认为如果Apdater对Presenter很熟悉,那么我应该让Presenter更新ListView而不是Adapter。
当遇到这种情况时,如何开发ListView?只需使用Adapter并继续使用MVP Pattern?
感谢您的阅读。
答案 0 :(得分:6)
适配器是视图的一部分。实际上,所有Android依赖项都应该是视图的一部分。 保持适配器与您的模型隔离,并且您的演示者使用是一项艰巨的任务。 I have released a library called PaperKnife for this purpose.
您可以使用PaperKnife将适配器与模型和演示者层分离。请按照以下步骤操作:
使用CellElement
接口抽象模型层。您的视图层不需要知道您的模型。
创建一个类以提供行视图的信息。您可以使用演示者。实现类CellDataProvider
并创建方法以提供所有信息。使用@DataSource("DataId")
注释您的提供程序方法以执行映射。您的数据方法接收模型类的实例。例如:
public class SamplePresenterImpl implements SamplePresenter, CellDataProvider {
@DataSource("Title")
public String getTitle(Item item) {
return item.getTitle();
}
// etc.
}
在适配器中创建ViewHolder
并实现CellViewHolder
接口。创建管理视图的方法并使用DataTarget("DataId")
static class ViewHolder extends CellViewHolder {
@DataTarget("Title")
public String setTitle(String title) {
mTextViewTitle.setText(title);
}
}
在适配器getView
方法中执行映射:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// etc.
PaperKnife.map(mList.get(position))
.dataProvider(mCellDataProvider)
.into(viewHolder);
return convertView;
}
通过这种方式,您的视图层只知道CellElement
界面,并且您的演示者负责向您的适配器提供数据。
答案 1 :(得分:2)
是的,适配器应该是MVP模式中的P组件。事实上,ListViews几乎被写成MVP- getView()函数需要在每次调用时设置视图的所有值,这几乎是演示者必须做的定义。虽然在MVC类型的方式中使用它也很容易 - 但只需在View上调用getView调用函数即可将模型传递给它,并在Views中完成。所以无论哪种方式都可行,只需选择您的偏好。
如果您确实使用具有复杂列表行的MVP模型,我喜欢将行设置为自定义复合视图并在其上放置更多描述性函数名称 - 而不是使用listRow.findViewById(R.id.textView).setText (filename)我将去listRow.setFilename(filename)并让视图知道如何处理它。这有点模糊了MVP和MVC的界限,但我发现它在适配器的可读性和避免纯MVC有时会带来的一些尴尬之间取得了很好的平衡。
答案 2 :(得分:1)
如果该活动中只有listview,则无需编写单独的演示者,因为Adapter实际上是ListView的Presenter。但是,如果您有其他UI组件而不是ListView需要更新,那么您必须为这些UI组件编写单独的Presenter。
答案 3 :(得分:0)
Android应用程序基本上是围绕模型 - 视图 - 控制器(MVC)构建的 - MVP听起来像是一回事,虽然我之前没有听过这个术语。活动充当了Controller的角色,XML Views就是这样(尽管你可以在Activity中以编程方式构建它们 - 在XML中更简单,更简单),以及你自己编写的模型。所以是的,这个模型非常实用。
您可能没有太多关于此设计模型的可能原因是Android框架强制您将视图分开。因为移动设备上的应用程序往往很小,所以人们不倾向于使用全面的MVC;它们倾向于视图和动作层,其中动作层完成模型(小)作业的大部分工作。
如果您正在编写跨平台应用程序,您可能需要查看四层方法:视图,操作,业务逻辑和模型。 View和Action层将是特定于平台的,而Business Logic和Model不会更改。基本上,您将演示者和用户交互分离到Action层,Action层调用业务逻辑层来执行用户想要的操作。