Articles of mvvm

如何有效地为我的Android应用程序实现MVVM设计模式,这也将简化测试用例的编写?

我正计划为我的Android应用程序实现MVVM架构设计模式。 我在网上看到它将帮助我实现有效的关注点分离,并轻松编写数据模型,UI等测试用例。需要一些见解/建议。

无法创建ViewModel类的实例

我正在尝试使用Android架构组件编写示例应用程序,但即使在尝试了几天之后我也无法使用它。 它给了我上面的例外。 生命周期所有者: – public class MainActivity extends LifecycleActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = findViewById(R.id.tv_user); PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class); viewModel.loadPosts(); viewModel.getPost().observe(this, new Observer() { @Override public void onChanged(@Nullable Post post) { if(post != null) { textView.setText(post.toString()); } } }); } } 视图模型: – public class PostViewModel extends ViewModel { […]

Android MVVM:具有多个片段的活动 – 在何处放置共享的LiveData?

我有一个关于android ViewModels的架构问题: 让我们说在我的应用程序中,我有一个带有两个片段的Activity(使用Viewpager)。 这两个片段做了不同的事情(因此可能有自己的ViewModel?),但它们也需要各种类似的数据。 例如,如果网络连接可用或不存在(并且两个片段在没有连接的情况下显示不同的错误UI),或者通过服务器推送来的某些用户设置并且同等地影响两个片段,则这是状态。 这看起来像这样: 现在我的问题是如何在使用ViewModels时处理这种情况? 视图是否观察多个ViewModel是好的,就像我有一个ViewModel用于Activity(保持两个都需要的状态)和每个片段一个,如下所示: 这里暗示了这一点,但这不是一个好习惯,因为MVVM中的关系通常是 查看n – 1 ViewModel n – 1模型 但我不确定这种共享LiveData的正确位置在哪里?

Android MVVM startActivity的最佳实践

我正在使用MVVM和DataBinding构建Android应用程序。 我在ViewModel中有一个函数来启动一个Activity。 是否可以在ViewModel中进行onClick调用? 喜欢这个。 public class MyViewModel { public void onClick(View view, long productId) { Context context = view.getContext(); Intent intent = new Intent(context, ProductDetailActivity.class); intent.putExtra(“productId”, productId); context.startActivity(intent); } } 在我的XML中: … android:onClick=”@{(v) -> viewModel.onClick(v, viewModel.product.id)}”> 或者将它移动到View并从EventBus或Rx调用它并在我的ViewModel中只有POJO是最佳做法吗?

Android ViewModel附加参数

有没有办法将其他parameter passing给我的自定义AndroidViewModel构造函数,除了Application上下文。 例: public class MyViewModel extends AndroidViewModel { private final LiveData<List> myObjectList; private AppDatabase appDatabase; public MyViewModel(Application application, String param) { super(application); appDatabase = AppDatabase.getDatabase(this.getApplication()); myObjectList = appDatabase.myOjectModel().getMyObjectByParam(param); } } 当我想要使用我的自定义ViewModel类时,我在我的片段中使用此代码: MyViewModel myViewModel = ViewModelProvider.of(this).get(MyViewModel.class) 所以我不知道如何将额外的参数String param传递给我的自定义ViewModel 。 我只能传递Application上下文,但不能传递其他参数。 我真的很感激任何帮助。 谢谢。 编辑:我添加了一些代码。 我希望现在好多了。

Android数据绑定:RecyclerView适配器的可观察列表

通过使用新数据绑定库和MVVM模式中的ObservableList类来避免使用Adapter类中的”notifyItem(s)…”方法,它们是一种方法吗? 或者如果不是,将ObservableList绑定到RecyclerView最简单方法是什么? 感谢任何线索!

MVVM模式和startActivity

我最近决定仔细研究Google发布的新Android架构组件,特别是将他们的ViewModel生命周期感知类用于MVVM架构和LiveData。 只要我处理单个活动或单个碎片,一切都很好。 但是,我找不到一个很好的解决方案来处理Activity切换。 比如说,为了一个简短的例子,活动A有一个按钮来启动活动B. startActivity()在哪里处理? 遵循MVVM模式,clickListener的逻辑应该在ViewModel中。 但是,我们希望避免在那里引用Activity。 因此,将上下文传递给ViewModel不是一种选择。 我缩小了几个似乎“没问题”的选项,但无法find任何正确的答案“这里是如何做到的”。 选项1 :在ViewModel中有一个枚举,其值映射到可能的路由(ACTIVITY_B,ACTIVITY_C)。 将它与LiveData结合使用。 活动将观察此LiveData,并且当ViewModel决定应该启动ACTIVITY_C时,它只是postValue(ACTIVITY_C)。 然后,Activity可以正常调用startActivity()。 选项2 :常规接口模式。 与选项1的原理相同,但Activity将实现接口。 虽然我觉得与此有点联系。 选项3 :消息选项,例如Otto或类似的。 ViewModel发送一个Broadcast,Activity选择它并启动它所拥有的内容。 此解决方案的唯一问题是,默认情况下,您应该将该广播的注册/取消注册放在ViewModel中。 所以没有帮助。 选项4 :拥有一个大的路由类,在某个地方,作为单例或类似的,可以被调用以将相关路由分派给任何活动。 最终通过界面? 所以每个活动(或BaseActivity)都会实现 IRouting { void requestLaunchActivity(ACTIVITY_B); } 当你的应用程序开始有很多片段/活动时,这个方法让我有点担心(因为路由类会变得很大) 就是这样了。 那是我的问题。 你们怎么处理这个? 你选择了我没有想到的选择吗? 您认为最相关的选项是什么?为什么? 推荐的Google方法是什么? PS:没有把我带到任何地方的链接1 – Android ViewModel调用Activity方法 2 – 如何从普通的非活动java类启动一个活动?

android数据绑定的优缺点是什么?

我的同事和我都有Web应用程序的MVVM经验,而我们是本机android开发的新手。 现在我们对android数据绑定有相反的看法 – 我不喜欢它的粉丝。 我的论点: 减少样板代码,从而减少样板代码 耦合较少 更强的可读性 function强大,易于实现自定义属性和自定义视图 甚至比findViewById更快( 细节 ) 他的论点: 自动生成的.class会增加应用程序大小。 更难调试 我做了一些调查,但关于它的讨论并不多。 现在我想收集android数据绑定的优缺点。 讨论的方面包括但不限于: unit testing 应用程序大小 性能 学习曲线 可读性 耦合

Android ViewModel没有零参数构造函数

我正在关注此文档以了解LiveData和ViewModel。 在doc中,ViewModel类具有构造函数, public class UserModel extends ViewModel { private MutableLiveData user; @Inject UserModel(MutableLiveData user) { this.user = user; } public void init() { if (this.user != null) { return; } this.user = new MutableLiveData(); } public MutableLiveData getUser() { return user; } } 但是,当我运行代码时,我得到exception: final UserViewModelviewModel = ViewModelProviders.of(this).get(UserViewModel.class); 引起:java.lang.RuntimeException:无法创建类UserViewModel的实例引起:java.lang.InstantiationException:java.lang.Class没有零参数构造函数

如何在Dialog中使用数据绑定?

我在Dialog中实现数据绑定时遇到了麻烦。 可能吗? 下面是我的xml。 我想在Dialog中绑定上面的布局。 这怎么可能? 下面是我试过的java代码,但它不起作用 dialog.setContentView(R.layout.dialog_ola_booking_confirmed); DialogOlaBookingConfirmedBinding binding = DataBindingUtil.inflate( LayoutInflater.from(dialog.getContext()), R.layout.dialog_ola_booking_confirmed, (ViewGroup) dialog.findViewById(R.id.cv), false); ViewModel viewModel = new ViewModel(this, event.olaBooking);