如何使用适用于Android的MVP模式控制ListView

Ori*_*erd 17 mvp android listview listadapter

我目前正在使用MVP Pattern开发一个Android应用程序.

当我尝试开发一个Activity时,我应该使用ListView.所以我正在使用Adapter for ListView.但我听说适配器类似于MVP模式上的Presenter.

我想如果Apdater对Presenter很熟悉,那么我应该让Presenter更新ListView而不是Adapter.

遇到这种情况时,如何开发ListView?只需使用适配器并继续使用MVP模式?

谢谢你的阅读.

alb*_*ina 6

适配器是视图的一部分.实际上,所有Android依赖项都应该是视图的一部分.保持适配器与您的模型隔离,并且您的演示者使用是一项艰巨的任务. 为此,我已经发布了一个名为PaperKnife的库.

您可以使用PaperKnife将适配器与模型和演示者层分离.请按照以下步骤操作:

  1. 使用CellElement接口抽象模型层.您的视图层不需要知道您的模型.

  2. 创建一个类以提供行视图的信息.您可以使用演示者.实现类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)
  3. 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)
  4. 在适配器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接口,并且您的演示者负责向您的适配器提供数据.


Gab*_*han 2

是的,Adapter应该是MVP模式中的P组件。事实上,ListView 几乎是按照 MVP 编写的 - getView() 函数需要在每次调用时设置视图的所有值,这几乎是演示者必须执行的操作的定义。尽管以 MVC 类型的方式使用它也很容易 - 只需在视图上使用 getView 调用函数,将模型传递给它并在视图中完成该工作。所以实际上无论哪种方式都可以,只需选择您的偏好即可。

如果您确实使用具有复杂列表行的 MVP 模型,我喜欢将这些行设为自定义复合视图,并在其上放置更多描述性函数名称,而不是使用 listRow.findViewById(R.id.textView).setText(filename)我将使用 listRow.setFilename(filename) 并让视图知道如何处理它。这有点模糊了 MVP 和 MVC 的界限,但我发现它在适配器的可读性和避免纯 MVC 有时带来的一些尴尬之间取得了很好的平衡。

  • 我不这么认为。MVP、MVC是架构模式,适配器是设计模式。它们不应该是相同的。请参阅讨论http://stackoverflow.com/a/4243407/3304280 (6认同)