Android 用于加载 UI 模型 class 具有 android 资源的 MVP 架构标准
Android MVP architecture standard for loading UI with Model class having android resource
我在我的应用程序中遵循 MVP 架构。我的 HomeActivity 包含一个带有列表图标的滑动面板,该列表图标具有选择器,在选择滑动面板项目时图标状态会更改,我没有使用任何列表选择器。
I am keeping a model class NavItemData for populating the
navigation drawer and using a class SlidingPanelItemSelector that
extends StateListDrawable generates the appropriate selector for the
sliding panel icon.
在 MVP 架构中,我们有一个演示器 class,它与模型通信并为视图生成输入。在我的例子中,如果我使用演示者获取滑动面板的数据,我从演示者那里调用 class,使用 android context 是一个很好的方法,或 我们是否有任何严格遵循 MVP 架构的替代解决方案?
Currently i am using a ViewBinderUtils class
and injected it directly to the activity class and gets the list of
data for Sliding Panel. Is it following Mvp Architcture?
SlidingPanelItemSelector.class
public class SlidingPanelItemSelector extends StateListDrawable {
private Context mContext;
public SlidingPanelItemSelector(Context mContext){
this.mContext = mContext;
}
public StateListDrawable getHomeSelector(){
StateListDrawable stateListDrawable = new StateListDrawable();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getDrawable(R.drawable.ic_nav_home));
}else{
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getResources().getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getResources().getDrawable(R.drawable.ic_nav_home));
}
return stateListDrawable;
}
}
ViewBinderUtils.class
public class ViewDataBinderUtils {
Context mContext;
@Inject
public ViewDataBinderUtils(@ActivityContext Context mContext) {
this.mContext = mContext;
}
public List<SlidingPanelData> getListData(String [] titles){
List<SlidingPanelData> items = new ArrayList<>();
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getHomeSelector(),titles[0],true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[1],false ));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[2],false));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoteSelector(),titles[3],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getEquipmentInventorySelector(),titles[4],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getCustomerSelector(),titles[5],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoterSelector(),titles[6],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getSalesProgramsSelector(),titles[7],false));
items.add(new SlidingPanelData( new SlidingPanelItemSelector(mContext).getCreditAppsSelector(),titles[8],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getRetailOffersSelector(),titles[9],false));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getPayOffersSelector(),titles[10],true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getAlertsSelector(),titles[11],true));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getTermofUseSelector(),titles[12],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getLegalInfoSelector(),titles[11],false));
return items;
}
}
演示者应该与上下文内容隔离,因为唯一应该知道上下文的部分是 View(V) 部分。
我不太理解你的这个 classes 的目标,但在一般情况下你应该遵循这个逻辑
if am using the presenter for getting the data for Sliding Panel i am
calling a class from presenter that using android context
创建一个接口,负责管理 View (V) 与 Presenter (P) 之间的通信。
Communication.java
public interface Communication {
void showLoading();
void hideLoading();
void setSlidingData(String [] titles);
}
您的视图应实现此接口 Comunication,并为 Presenter 提供参考。如果你需要使用 Interactor (I) 的上下文,你应该有一个 class 来管理它(在我的例子中是 RequestHolder).
View.java
public View implements Communication{
private Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// your view already implements the Comunication interface
mPresenter = new Presenter(this);
}
(...)
private void getData(){
mPresenter.getData(new RequestHolder(getApplicationContext()));
}
@Override
public void setSlidingData(String [] titles){
List<SlidingPanelData> items = new ArrayList<>();
items.add(new SlidingPanelData(new SlidingPanelItemSelector(getApplicationContext()).getHomeSelector(),titles[0],true));
}
}
演示者中有您的界面参考
Presenter.java
private Communication mView;
public Presenter(Communication view) {
mView = view;
}
/** event to receive data from the model **/
public void onEvent(GetDataMessage event){
mView.setSlidingData(event.getData());
}
public void getData(final RequestHolder holder){
new GetDataInteractor(holder);
}
RequestHolder.java
// you can put the data important to the interactor
public RequestHolder(final Context context, int accountId) {
super(context);
}
//getters and setters
有了这个,您可以访问交互器内部的上下文,而无需混合概念
总之,
- 视图是唯一提供上下文的视图
- View 引用了 Presenter
- Presenter "talks" with View between Interface
在您的具体情况下,为什么不创建需要视图部分上下文的列表并填充列表项 = new ArrayList<>();在你的主持人部分?这样你就可以把所有东西都隔离开来
我在我的应用程序中遵循 MVP 架构。我的 HomeActivity 包含一个带有列表图标的滑动面板,该列表图标具有选择器,在选择滑动面板项目时图标状态会更改,我没有使用任何列表选择器。
I am keeping a model class NavItemData for populating the navigation drawer and using a class SlidingPanelItemSelector that extends StateListDrawable generates the appropriate selector for the sliding panel icon.
在 MVP 架构中,我们有一个演示器 class,它与模型通信并为视图生成输入。在我的例子中,如果我使用演示者获取滑动面板的数据,我从演示者那里调用 class,使用 android context 是一个很好的方法,或 我们是否有任何严格遵循 MVP 架构的替代解决方案?
Currently i am using a ViewBinderUtils class and injected it directly to the activity class and gets the list of data for Sliding Panel. Is it following Mvp Architcture?
SlidingPanelItemSelector.class
public class SlidingPanelItemSelector extends StateListDrawable {
private Context mContext;
public SlidingPanelItemSelector(Context mContext){
this.mContext = mContext;
}
public StateListDrawable getHomeSelector(){
StateListDrawable stateListDrawable = new StateListDrawable();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getDrawable(R.drawable.ic_nav_home));
}else{
stateListDrawable.addState(new int[]{android.R.attr.state_pressed},
mContext.getResources().getDrawable(R.drawable.ic_nav_home_active));
stateListDrawable.addState(new int[]{},mContext.getResources().getDrawable(R.drawable.ic_nav_home));
}
return stateListDrawable;
}
}
ViewBinderUtils.class
public class ViewDataBinderUtils {
Context mContext;
@Inject
public ViewDataBinderUtils(@ActivityContext Context mContext) {
this.mContext = mContext;
}
public List<SlidingPanelData> getListData(String [] titles){
List<SlidingPanelData> items = new ArrayList<>();
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getHomeSelector(),titles[0],true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[1],false ));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getConfigurationSelector(),titles[2],false));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoteSelector(),titles[3],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getEquipmentInventorySelector(),titles[4],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getCustomerSelector(),titles[5],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getQuoterSelector(),titles[6],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getSalesProgramsSelector(),titles[7],false));
items.add(new SlidingPanelData( new SlidingPanelItemSelector(mContext).getCreditAppsSelector(),titles[8],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getRetailOffersSelector(),titles[9],false));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getPayOffersSelector(),titles[10],true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getAlertsSelector(),titles[11],true));
items.add(new SlidingPanelData(true));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getTermofUseSelector(),titles[12],false));
items.add(new SlidingPanelData(new SlidingPanelItemSelector(mContext).getLegalInfoSelector(),titles[11],false));
return items;
}
}
演示者应该与上下文内容隔离,因为唯一应该知道上下文的部分是 View(V) 部分。 我不太理解你的这个 classes 的目标,但在一般情况下你应该遵循这个逻辑
if am using the presenter for getting the data for Sliding Panel i am calling a class from presenter that using android context
创建一个接口,负责管理 View (V) 与 Presenter (P) 之间的通信。
Communication.java
public interface Communication {
void showLoading();
void hideLoading();
void setSlidingData(String [] titles);
}
您的视图应实现此接口 Comunication,并为 Presenter 提供参考。如果你需要使用 Interactor (I) 的上下文,你应该有一个 class 来管理它(在我的例子中是 RequestHolder).
View.java
public View implements Communication{
private Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// your view already implements the Comunication interface
mPresenter = new Presenter(this);
}
(...)
private void getData(){
mPresenter.getData(new RequestHolder(getApplicationContext()));
}
@Override
public void setSlidingData(String [] titles){
List<SlidingPanelData> items = new ArrayList<>();
items.add(new SlidingPanelData(new SlidingPanelItemSelector(getApplicationContext()).getHomeSelector(),titles[0],true));
}
}
演示者中有您的界面参考
Presenter.java
private Communication mView;
public Presenter(Communication view) {
mView = view;
}
/** event to receive data from the model **/
public void onEvent(GetDataMessage event){
mView.setSlidingData(event.getData());
}
public void getData(final RequestHolder holder){
new GetDataInteractor(holder);
}
RequestHolder.java
// you can put the data important to the interactor
public RequestHolder(final Context context, int accountId) {
super(context);
}
//getters and setters
有了这个,您可以访问交互器内部的上下文,而无需混合概念
总之,
- 视图是唯一提供上下文的视图
- View 引用了 Presenter
- Presenter "talks" with View between Interface
在您的具体情况下,为什么不创建需要视图部分上下文的列表并填充列表项 = new ArrayList<>();在你的主持人部分?这样你就可以把所有东西都隔离开来