ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 在片段视图模型之间传递数据

2019-06-22 11:11:59  阅读:211  来源: 互联网

标签:android android-fragments kotlin android-viewmodel


我先说一点,这更像是一个“结构性”问题,我不是要求任何人编写代码;我只想弄清楚我应该如何构建我的应用程序.

我正在为我的应用程序使用Android的DrawerLayout / NavigationView.这意味着MainActivity是我所有片段的主机.

我目前有三个片段(实际上它有更多,但它们或多或少完全像这三个片段,只是针对不同的数据集).

> ListFragment
> DetailFragment
> EditFragment(用于添加和编辑)

在我的ListFragment上,我(惊喜!)一个项目列表.这是SharedViewModel上的LiveData集合(与MainActivity的生命周期相关联).当点击一个项目时,我通过一个接口监听器将事件传递给MainActivity.

然后MainActivity加载DetailFragment.在同一个调用中,我加载了一个SharedViewModel实例(再次绑定到MainActivity).我将SharedViewModel.selectedItem设置为tapped项目.然后,在DetailFragment的onCreate函数中,我通过ViewModelProviders.of(activity).get(SharedViewModel :: class.java).selectedItem获取所选项.

在DetailFragment上,有一个编辑按钮.这或多或少与上面描述的相同,但是加载EditFragment.保存编辑/添加的项目后,我通过MainActivity的界面侦听器添加/替换SharedViewModel集合中的项目.

显然,由于几个原因,这不是最佳的.首先,这意味着我至少有五个大型数据集可以用于MainActivity的生命周期(基本上是应用程序的整个生命周期).此外,由于我必须添加越来越多的函数来处理事件,因此MainActivity变得无法控制.

我想要做的是,例如,ListFragmentViewModel上的项目列表与ListFragment的生命周期相关联.我在DetailFragmentViewModel上的所选项目,我在EditFragmentViewModel上的编辑项目等.

我的问题是,在这种情况下,我不确定如何正确传递数据.例如,假设我在EditFragment中添加了一个新项.如何将其添加到ListFragmentViewModel的项目集合中? ListFragment位于后台堆栈中,因此它的视图模型会挂起并且在导航回来时不会重新加载数据,因为它仍然具有之前的集合.这是有意义的,可能是它应该如何(毕竟,谁想要等到所有数据加载到DetailFragment并返回到ListFragment?),但这意味着我没有得到我的新项目采集.

这只是一个例子,但我遇到了很多类似的问题(例如将所选项目传递给DetailFragmentViewModel.)

我不太确定我应该去哪里这个方向.更有经验的人可以帮帮我吗?

解决方法:

let’s say I add a new item in EditFragment. How do I get that into ListFragmentViewModel’s collection of items?

EditFragment告诉您的项目存储库,“哟!这是一个新项目!”.项目存储库安排更新您的后备存储,并向感兴趣的各方发出事件通知数据更改(例如,在RxJava PublishSubject上发出事件). ListFragmentViewModel侦听这些事件并做出相应的反应.

ListFragment is in the back-stack, so its viewmodel hangs around and doesn’t reload the data when it’s navigated back to, since it still has the collection from before

它应该从您的项目存储库中找出数据更改,并采取任何有意义的方式来反映数据更改.这可能只是从数据更改事件中获取数据并更新其内存内容.这可能是从后备存储重新请求信息.原则上,它可能是别的东西.

标签:android,android-fragments,kotlin,android-viewmodel
来源: https://codeday.me/bug/20190622/1263167.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有