Sun*_*nny 10 mvp android android-layout android-selector navigation-drawer
我在我的应用程序中遵循MVP架构.我的HomeActivity包含一个带有列表图标的滑动面板,其中包含选择器,选择滑动面板项目时图标状态已更改,我没有使用任何列表选择器.
我保留了一个模型类NavItemData,用于填充导航抽屉,并使用扩展StateListDrawable 的类SlidingPanelItemSelector为滑动面板图标生成适当的选择器.
在MVP架构中,我们有一个演示者类,它与模型通信并生成视图的输入.在我的情况下,如果我使用演示者获取滑动面板的数据我正在调用使用Android上下文的演示者的类是一个很好的方法,或者我们有任何替代解决方案,严格遵循MVP架构?
目前我正在使用ViewBinderUtils类并将其直接注入活动类并获取Sliding Panel的数据列表.它是否遵循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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
演示者应该与上下文隔离,因为唯一应该了解上下文的部分是视图( V) 部分。我不太明白你在这门课上的目标,但一般来说你应该遵循这个逻辑
如果我使用演示者获取滑动面板的数据,我将从使用 android 上下文的演示者调用一个类
创建一个接口,负责管理View(V)与Presenter(P)之间的通信。
通信.java
public interface Communication {
void showLoading();
void hideLoading();
void setSlidingData(String [] titles);
}
Run Code Online (Sandbox Code Playgroud)
你的View应该实现这个接口Communication,并且有Presenter的引用。如果您需要使用Interactor (I)的上下文,您应该有一个类来管理它(在我的例子中为RequestHolder)。
视图.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));
}
}
Run Code Online (Sandbox Code Playgroud)
演示者中有您的界面参考
演示者.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);
}
Run Code Online (Sandbox Code Playgroud)
RequestHolder.java
// you can put the data important to the interactor
public RequestHolder(final Context context, int accountId) {
super(context);
}
//getters and setters
Run Code Online (Sandbox Code Playgroud)
这样您就可以访问交互器内部的上下文,而无需混合概念
总共,
在您的具体情况下,为什么您不创建需要视图部分上下文并填充 List items = new ArrayList<>(); 的列表 在你的演讲者部分?这样你就可以隔离一切
| 归档时间: |
|
| 查看次数: |
1014 次 |
| 最近记录: |