这是一个示例场景:
我有一个活动(视图)和该视图的演示者.演示者从网络API中提取用户列表,并使用List对象将其保存在内存中.活动包含不同类型的片段,以根据User.type显示有关用户的内容.这两个片段(UserType1Fragment和UserType2Fragment)也有各自的演示者.
活动的演示者决定下一个片段的类型(I或II).片段的演示者决定用户对象的显示方式,并处理名为killUser()的按钮单击事件.这应该更新活动的演示者中的List对象.
这就是问题所在:
片段如何呈现对活动演示者中的数据的引用?演示者不应直接相互沟通.也许我应该将List抽象到存储库/交互器中?如何在演示者之间共享列表?
我目前正在实施Monotouch应用程序,最终将移植到Monodroid.该应用程序只是OData Web服务的客户端.没有什么太花哨或性能至关重要.
挑战是尽可能多地重用代码.我知道Monotouch和Monodroid的UI API完全不同,但我希望重用数据数据抽象和业务层.
由于我的UI层遵循MVP模式,我还希望通过编写每个视图的抽象表示来重用UI控制器.但是,我只能猜测这是否有效,因为我还没有被允许进入Monodroid测试版.
现在我的问题:
您如何看待这种方法?这是一个好主意,还是会因为iPhone和Android之间的UI概念不同而导致平庸的应用程序?
您能否提供有关如何构建应用程序以最大化代码重用的任何提示?
谢谢,
阿德里安
关于接口和实现它们的类,如何组织解决方案/项目的标准?我正在研究一个MVP,DDD应用程序,并希望听到关于其他人如何布置他们的项目以及他们为什么这样做的反馈.谢谢!!
我们正在使用MVP模式,我想知道如何处理GUI操作.
例如,当用户想要从网格中删除行时,用户按下删除按钮.此时你可以做两件事:
1)呼叫_presenter.DeleteRow(),然后主持人呼叫_view.SelectedRow.然后演示者调用view.AskUserForConfirmation(),当它返回时DialogResult.OK,演示者实际上删除底层对象并刷新网格.
2)该表格要求用户进行确认,并且当DialogResult是OK,那么presenter.Delete(myObject)被称为OR presenter.Delete()被称为和内Delete方法的对象是通过调用检索_view.SelectedRow.
你如何处理这些情况?
最近我开始阅读很多关于MVP的内容,我想用它练习我的项目.
但是我无法正确理解Rx + Retrofit代码应该去哪里?我认为应该通过Interactors在Model Layer中,但仍然可以有人对此有所了解吗?
RX回调会发生什么?onNext(),onCompleted()和onFailure()将数据传递回Presenter,还是我们实现了侦听器,然后将其传递给Presenter?
当我在onNext()中获取数据时,我还想保留数据(Realm/StorIO),所以再次将它传递给另一个DataLayer或它应该去哪里?
我们还应该进一步解耦Rx回调吗?
这个来自antonioleiva.com的单独github回购 https://github.com/antoniolg/androidmvp
我在我的应用程序中遵循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 …Run Code Online (Sandbox Code Playgroud) mvp android android-layout android-selector navigation-drawer
我有几个问题,
首先,当我阅读一些文章时,我应该在活动中实现LocationListener,ConnectionCallback,OnConnectionFailedListener接口,
在不同的文件中分离这些类的实现是否正确?
喜欢下面?
public class LocationListener implements
com.google.android.gms.location.LocationListener {
@Inject
Location mLastLocation;
@Override
public void onLocationChanged(Location location) {
// Assign the new location
mLastLocation = location;
// Displaying the new location on UI
}
}
Run Code Online (Sandbox Code Playgroud)
我处理的活动是否正确显示mLastLocation属性?
//Fields
@Inject
GoogleApiClient client;
Location mLastLocation;
//Fields
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);
Run Code Online (Sandbox Code Playgroud)
第二,我该如何为它编写提供者方法?,我的猜测会是这样的,你们会推荐什么?
//Constructor
public LocationModule(Context context, GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
this.context = context;
this.callback = callback;
this.listener = listener;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApi() {
return new GoogleApiClient.Builder(context)
.addOnConnectionFailedListener(listener)
.addConnectionCallbacks(callback)
.addApi(LocationServices.API) …Run Code Online (Sandbox Code Playgroud) mvp android dependency-injection dagger-2 android-6.0-marshmallow
我正在尝试重构现有的应用程序以使用MVP架构.其中一项活动有ViewPager三个片段.每个片段都与演示者链接.确切地说 - 每个演示者在创建时都会被赋予一个View工作,即a Fragment.现在,我正在这个ViewPager适配器中创建这些演示者- 特别是在getItem(int position)方法中.
Fragment fragment = FirstFragment.newInstance();
FirstPresenter presenter = new FirstPresenter(repo, (FirstContract.View) fragment, projectId, userId);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,如果进程被杀死然后重新启动,ViewPager它有自己的生命周期,因此getItem不再被调用 - 片段会自动重建,没有演示者.
这个问题有一个已知的解决方案吗?
所以我有一个已经与活动相关联的演示者.这本书说一个主持人应该绑在一个视图上.但现在我添加了一些片段和大量自定义视图.我正在考虑一个片段作为一个观点.自定义视图将包含一些逻辑.片段和自定义视图当然都包含在我的活动中.
我的问题是,我应该在片段和自定义视图中重复使用相同的演示者,还是每个视图都应该有自己的演示者?我意识到这是基于意见,但我想要最好的方法来测试和保持代码清洁.
如果我确实为所有这些少数人提供了一个演示者,那么接口演示者使用将有许多回调方法.同时,如果我做了相反的操作并为每个视图创建了一个演示者,那么它可能更容易阅读,但我将如何测试呢?
最近我接手了一个建立在MVP之上的android项目.虽然简单的屏幕非常简单,易于阅读和维护,但应用程序中更复杂的部分却不是.多个继承级别导致我在类之间切换几天,试图找出信息流实际上是如何工作的.
这里是一个更有问题的层次结构的例子:
由于我们使用MVP,因此图中的每个类自然会有另一个presenter类和另一个视图类.
所以我做了一些研究并发现了这篇文章: MVP中的组合与继承 ,它基本上说在这种情况下组合应该优于继承.不说的是如何在android中应用它.我想了一会儿,但不能想出一个漂亮的模式.我可以做自定义视图,但他们最终会如何使用演示者?
mvp ×10
android ×7
architecture ×2
.net ×1
android-mvp ×1
c# ×1
dagger-2 ×1
rx-android ×1
rx-java ×1
winforms ×1
xamarin.ios ×1