【发布时间】:2016-05-27 19:29:39
【问题描述】:
我已经开始研究关于 Android 框架的 MVP,因为我想开始我未来的一些设计模式的工作,并且我了解到 MVP 非常适合构建 Android 应用程序。
我对 MVP 原则有疑问:
例子是:
我有一个 视图,它有 2 个交互 选项:
- 首先是在屏幕上列出项目,例如:水果。
- 第二个是当水果被列出时,用户可以点击它,它应该打印出单词中的字母数
Presenter 应该在水果被点击 时捕捉事件,计算字母,并调用 View 的打印函数。
对于 MVP,我尝试了这种方法:
我的观点:
public class MainActivity extends Activity implements MainView, View.OnClickListener {
ViewGroup fruitsContainer;
Button listFruitsBtn;
MyPresenter myPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Making my presenter, its only parameter is a MainView, this MainView.
myPresenter = new MyPresenter(this);
fruitsContainer = (ViewGroup) findViewById(R.id.fruitsContainer);
listFruitsBtn = (Button) findViewById(R.id.list_fruits_btn);
listFruitsBtn.setOnClickListener(this);
}
/**
* Showing fruits, making a TextView for each.
*/
@Override
public void showFruits(List<String> fruits) {
fruitsContainer.removeAllViews();
for (String fruit : fruits) {
TextView textView = new TextView(this);
textView.setText(fruit);
//Question part 1: How does the presenter will know WHICH fruit is clicked?
textView.setOnClickListener(this);
fruitsContainer.addView(textView);
}
}
/**
* When user clicks on the "show fruits" button, the view calls for presenter to take action.
*/
@Override
public void onClick(View v) {
if (v.equals(listFruitsBtn)) {
myPresenter.fruitButtonClicked();
}
else if(v instanceof TextView)
{
TextView textView = (TextView) v;
//Question part 2: How does the presenter will know WHICH fruit is clicked?
//In theory this operation is forbidden as far as I know.
//MVP does not supports views to know anything about the Model that they are showing.
myPresenter.fruitIsClicked(textView.getText().toString());
}
}
}
我的演示者:
public class MyPresenter {
MainView mainView;
public MyPresenter(MainView mainView) {
this.mainView = mainView;
}
/**
* Got a callback for "show fruits" event invoked
* so we call the mainView's showFruits function with the model's data parameter
*/
public void fruitButtonClicked() {
this.mainView.showFruits(MyModel.getFruitsList());
}
//In theory this operation is forbidden as far as I know.
//MVP does not supports views to know anything about the Model that they are showing.
public void fruitIsClicked(String fruit) {
//Clicked operation - counting letters - call print operation of myView
}
}
注意:这里的 Model 是一个 String 只是因为为了简化示例,它可以是任何健壮的类。
据我了解,MVP 的原则之一是 Views 对它们所展示的 Model 一无所知。因此,将 Model 实例保存为 View 实例的属性是不行的,然后在需要时(进行交互时)将 Model 实例传递给 Presenter 以执行进一步的业务逻辑。 (数字母)
所以我的问题是在这样的情况下,当 Views 代表一个特定的 Model 实例,演示者如何确切知道哪个 Model 实例正在交互?
如果我误解了什么,请仔细向我详细解释。
(我是从this site那里学到的);
【问题讨论】:
标签: android design-patterns mvp