首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Android资源的Model类加载UI的android体系结构标准

带有Android资源的Model类加载UI的android体系结构标准
EN

Stack Overflow用户
提问于 2016-04-19 05:22:39
回答 1查看 1.2K关注 0票数 10

在我的应用程序中,我遵循MVP架构。我的HomeActivity包含一个具有列表图标的滑动面板,它具有选择器,即在选择滑动面板项时,图标状态被更改,并且我没有使用任何列表选择器。

我保留一个模型类NavItemData,用于填充导航抽屉,并使用扩展StateListDrawable的类StateListDrawable为滑动面板图标生成适当的选择器。

在MVP体系结构中,我们有一个演示器类,它与模型通信并为视图生成输入。在我的例子中,,如果我使用演示器获取滑动面板的数据,我从演示者调用一个类,即使用android上下文是一种很好的方法,或者我们有任何严格遵循MVP体系结构的替代解决方案?

目前,我正在使用一个ViewBinderUtils类,并将其直接注入活动类,并获取滑动面板的数据列表。它是否遵循Mvp架构?

SlidingPanelItemSelector.class

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-27 13:01:23

演示者应该与上下文内容隔离,因为应该了解上下文的唯一部分是View(V)部分。我不太理解这个类的目标,但是在一般情况下,您应该遵循这个逻辑。

如果我使用演示器获取滑动面板的数据,则我从演示者调用一个类,该类使用android上下文

创建一个接口,负责管理视图 (V)与演示程序 (P)之间的通信。

Communication.java

代码语言:javascript
复制
public interface Communication {
    void showLoading();
    void hideLoading();
    void setSlidingData(String [] titles);
}

您的视图应该实现此接口通信,并为演示者提供参考。而且,如果您需要使用上下文来进行Interactor (I),那么您应该有一个管理这个类(在我的例子中是RequestHolder)。

View.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
// you can put the data important to the interactor
public RequestHolder(final Context context, int accountId) {
    super(context); 
}
//getters and setters

有了这个,您就可以访问interactor内部的上下文,而无需混合概念。

总之,

  • 视图是唯一提供上下文的视图。
  • 视图具有对演示者的引用。
  • 演示者在界面之间使用View "talks“

在特定情况下,为什么不在视图部件中创建需要上下文的列表,并在演示者部分填充列表项=新的ArrayList<>()?有了这个,一切都是孤立的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36709244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档