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

9 浏览
0 Comments

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

我目前正在使用MVP模式开发一款Android应用程序。\n当我尝试开发一个Activity时,我应该使用ListView。所以我正在使用Adapter来为ListView提供数据。但是我听说Adapter与MVP模式中的Presenter相似。\n我认为如果Adapter与Presenter相似,那么我应该为更新ListView创建Presenter,而不是Adapter。\n在这种情况下,如何开发ListView?只需要使用Adapter并继续使用MVP模式吗?\n感谢您的阅读。

0
0 Comments

如何使用MVP模式控制Android中的ListView?

在Android开发中,我们经常会遇到需要使用ListView来展示数据的情况。在使用ListView时,我们通常会遵循MVP(Model-View-Presenter)模式来进行代码架构。而在MVP模式中,ListView的Adapter实际上充当了Presenter的角色。但是,如果我们的Activity中除了ListView之外还有其他需要更新的UI组件,那么我们就需要为这些UI组件编写单独的Presenter。

为什么需要编写单独的Presenter呢?原因在于,ListView的Adapter只负责数据的展示,而无法直接更新其他UI组件。如果我们希望在ListView的数据发生变化时同时更新其他UI组件,那么我们就需要通过Presenter来进行中介。

解决方法是编写一个专门负责控制ListView的Presenter。这个Presenter将负责处理ListView的数据逻辑,并与Activity进行交互,从而更新其他UI组件。通过这种方式,我们可以保持代码的清晰和可维护性。

在实现这个Presenter时,我们可以参考以下步骤:

1. 在Activity中定义一个接口,用于与Presenter进行交互。这个接口应包含更新UI组件的方法。

public interface ListViewContract {

void updateUIComponent();

}

2. 编写一个Presenter类,实现这个接口。在Presenter中,我们可以处理ListView的数据逻辑,并在数据发生变化时调用Activity中的方法来更新其他UI组件。

public class ListViewPresenter implements ListViewContract.Presenter {

private ListViewContract.View view;

public ListViewPresenter(ListViewContract.View view) {

this.view = view;

}

// 在这里处理ListView的数据逻辑

@Override

public void onDataChanged() {

// 当数据发生变化时,调用Activity中的方法来更新其他UI组件

view.updateUIComponent();

}

}

3. 在Activity中实现ListViewContract.View接口,并创建一个ListViewPresenter的实例。在Activity中,我们可以通过Presenter来更新其他UI组件。

public class MainActivity extends AppCompatActivity implements ListViewContract.View {

private ListViewPresenter presenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

presenter = new ListViewPresenter(this);

// 初始化ListView,并设置Adapter

}

@Override

public void updateUIComponent() {

// 更新其他UI组件的逻辑

}

}

通过以上步骤,我们成功地将ListView的控制与其他UI组件的更新进行了分离,使得代码更加清晰和可维护。在实际开发中,我们可以根据具体需求对Presenter进行更多的扩展和优化,以满足项目的要求。

0
0 Comments

问题的出现的原因:讨论中有人认为Adapter应该是MVP模式中的P(Presenter)组件,因为ListView的getView()函数需要在每次调用时设置视图的所有值,这几乎就是Presenter必须做的事情的定义。而另一些人则认为Adapter是MVP模式中的V(View)组件,因为它负责创建和显示布局项。这些不同的观点引发了对于Adapter在MVP模式中的角色和位置的争议。

解决方法:对于那些认为Adapter是P组件的人来说,他们认为可以将复杂的列表行作为自定义的复合视图,并在其上使用更具描述性的函数名,从而模糊了MVP和MVC之间的界限,提高了Adapter的可读性。而对于那些认为Adapter是V组件的人来说,他们认为Adapter负责将数据适配到视图上,并认为将Adapter作为P组件会使得P无法在JUnit中进行测试。最终某些情况下了Android的Presenter类,该类与Adapter的功能相似,也有人认为这可能是Adapter作为P组件的原因。没有达成共识,但是大部分人认为Adapter可以作为MVP模式中的P或V组件。

根据以上内容,可以整理成以下文章:

标题:如何在Android中使用MVP模式控制ListView

正文:

在Android开发中,我们经常会使用ListView来展示数据列表。但是如何在ListView中使用MVP(Model-View-Presenter)模式呢?这个问题引发了一场讨论。

讨论的焦点是关于Adapter在MVP模式中的角色和位置。有人认为Adapter应该是MVP模式中的P(Presenter)组件,因为ListView的getView()函数需要在每次调用时设置视图的所有值,这几乎就是Presenter必须做的事情的定义。另一些人则认为Adapter是MVP模式中的V(View)组件,因为它负责创建和显示布局项。

对于那些认为Adapter是P组件的人来说,他们提出了一种解决方法。他们建议将复杂的列表行作为自定义的复合视图,并在其上使用更具描述性的函数名。例如,而不是使用listRow.findViewById(R.id.textView).setText(filename),他们会使用listRow.setFilename(filename)。这种做法提高了Adapter的可读性,但也模糊了MVP和MVC之间的界限。

而对于那些认为Adapter是V组件的人来说,他们认为Adapter负责将数据适配到视图上,并且认为将Adapter作为P组件会使得P无法在JUnit中进行测试。他们提出了另一种解决方法,即将Adapter作为V组件,使用另一个单独的P组件来处理从模型获取数据和处理列表项的操作。

讨论中还某些情况下了Android的Presenter类,该类与Adapter的功能相似。这引发了一些人认为Adapter可以作为P组件的可能性。

讨论没有达成共识,但大部分人认为Adapter可以作为MVP模式中的P或V组件。因此,开发人员可以根据自己的喜好选择使用MVP或MVC模式来控制ListView。

参考链接:

- [stackoverflow.com/a/4243407/3304280](http://stackoverflow.com/a/4243407/3304280)

- [en.m.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter](https://en.m.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter)

- [developer.android.com/reference/android/support/v17/leanback/widget/Presenter.html](https://developer.android.com/reference/android/support/v17/leanback/widget/Presenter.html)

0
0 Comments

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

在Android中,适配器是视图的一部分。事实上,所有的Android依赖都应该是视图的一部分。然而,将适配器与模型和Presenter隔离开是一项困难的任务。

为了将适配器与模型和Presenter隔离开,我发布了一个名为PaperKnife的库,你可以使用它。下面是使用PaperKnife来解决这个问题的步骤:

1. 使用CellElement接口对模型层进行抽象。你的视图层不需要知道你的模型。

2. 创建一个类来为你的行视图提供信息。你可以使用你的Presenter。实现CellDataProvider类,并创建方法来提供所有的信息。使用@DataId注释你的提供者方法以进行映射。你的数据方法接收你的模型类的实例。例如:

public class SamplePresenterImpl implements SamplePresenter, CellDataProvider {
    @DataId("Title")
    public String getTitle(Item item) {
        return item.getTitle();
    }
    // etc.
}

3. 在你的适配器中创建一个ViewHolder类,并实现CellViewHolder接口。创建方法来管理视图,并使用@DataTarget("DataId")注释。

static class ViewHolder extends CellViewHolder {
    @DataTarget("Title")
    public String setTitle(String title) {
        mTextViewTitle.setText(title);
    }
}

4. 在你的适配器的getView方法中执行映射:

public View getView(int position, View convertView, ViewGroup parent) {
    // etc.
    PaperKnife.map(mList.get(position))
                    .dataProvider(mCellDataProvider)
                    .into(viewHolder);
    return convertView;
}

通过这种方式,你的视图层只需要知道CellElement接口,而你的Presenter负责为适配器提供数据。

0