在我的应用程序中,我遵循MVP架构。我的HomeActivity包含一个具有列表图标的滑动面板,它具有选择器,即在选择滑动面板项时,图标状态被更改,并且我没有使用任何列表选择器。
我保留一个模型类NavItemData,用于填充导航抽屉,并使用扩展StateListDrawable的类StateListDrawable为滑动面板图标生成适当的选择器。
在MVP体系结构中,我们有一个演示器类,它与模型通信并为视图生成输入。在我的例子中,,如果我使用演示器获取滑动面板的数据,我从演示者调用一个类,即使用android上下文是一种很好的方法,或者我们有任何严格遵循MVP体系结构的替代解决方案?。
目前,我正在使用一个ViewBinderUtils类,并将其直接注入活动类,并获取滑动面板的数据列表。它是否遵循Mvp架构?
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;
}
}发布于 2016-04-27 13:01:23
演示者应该与上下文内容隔离,因为应该了解上下文的唯一部分是View(V)部分。我不太理解这个类的目标,但是在一般情况下,您应该遵循这个逻辑。
如果我使用演示器获取滑动面板的数据,则我从演示者调用一个类,该类使用android上下文
创建一个接口,负责管理视图 (V)与演示程序 (P)之间的通信。
Communication.java
public interface Communication {
void showLoading();
void hideLoading();
void setSlidingData(String [] titles);
}您的视图应该实现此接口通信,并为演示者提供参考。而且,如果您需要使用上下文来进行Interactor (I),那么您应该有一个管理这个类(在我的例子中是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有了这个,您就可以访问interactor内部的上下文,而无需混合概念。
总之,
在特定情况下,为什么不在视图部件中创建需要上下文的列表,并在演示者部分填充列表项=新的ArrayList<>()?有了这个,一切都是孤立的
https://stackoverflow.com/questions/36709244
复制相似问题