Ori*_*erd 17 mvp android listview listadapter
我目前正在使用MVP Pattern开发一个Android应用程序.
当我尝试开发一个Activity时,我应该使用ListView.所以我正在使用Adapter for ListView.但我听说适配器类似于MVP模式上的Presenter.
我想如果Apdater对Presenter很熟悉,那么我应该让Presenter更新ListView而不是Adapter.
遇到这种情况时,如何开发ListView?只需使用适配器并继续使用MVP模式?
谢谢你的阅读.
适配器是视图的一部分.实际上,所有Android依赖项都应该是视图的一部分.保持适配器与您的模型隔离,并且您的演示者使用是一项艰巨的任务. 为此,我已经发布了一个名为PaperKnife的库.
您可以使用PaperKnife将适配器与模型和演示者层分离.请按照以下步骤操作:
使用CellElement接口抽象模型层.您的视图层不需要知道您的模型.
创建一个类以提供行视图的信息.您可以使用演示者.实现类CellDataProvider并创建方法以提供所有信息.使用提供程序方法注释@DataSource("DataId")以执行映射.您的数据方法接收模型类的实例.例如:
public class SamplePresenterImpl implements SamplePresenter, CellDataProvider {
@DataSource("Title")
public String getTitle(Item item) {
return item.getTitle();
}
// etc.
}
Run Code Online (Sandbox Code Playgroud)ViewHolder在适配器中创建一个并实现该CellViewHolder接口.创建管理视图和使用的方法DataTarget("DataId")
static class ViewHolder extends CellViewHolder {
@DataTarget("Title")
public String setTitle(String title) {
mTextViewTitle.setText(title);
}
}
Run Code Online (Sandbox Code Playgroud)在适配器getView方法中执行映射:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// etc.
PaperKnife.map(mList.get(position))
.dataProvider(mCellDataProvider)
.into(viewHolder);
return convertView;
}
Run Code Online (Sandbox Code Playgroud)通过这种方式,您的视图层只知道CellElement接口,并且您的演示者负责向您的适配器提供数据.
是的,Adapter应该是MVP模式中的P组件。事实上,ListView 几乎是按照 MVP 编写的 - getView() 函数需要在每次调用时设置视图的所有值,这几乎是演示者必须执行的操作的定义。尽管以 MVC 类型的方式使用它也很容易 - 只需在视图上使用 getView 调用函数,将模型传递给它并在视图中完成该工作。所以实际上无论哪种方式都可以,只需选择您的偏好即可。
如果您确实使用具有复杂列表行的 MVP 模型,我喜欢将这些行设为自定义复合视图,并在其上放置更多描述性函数名称,而不是使用 listRow.findViewById(R.id.textView).setText(filename)我将使用 listRow.setFilename(filename) 并让视图知道如何处理它。这有点模糊了 MVP 和 MVC 的界限,但我发现它在适配器的可读性和避免纯 MVC 有时带来的一些尴尬之间取得了很好的平衡。