首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ViewModel + LiveData in Fragment,从ItemDetailFragment返回时如何保留ListItemFragment的数据

在Android开发中,ViewModel和LiveData是一对非常有用的组件,用于在Fragment或Activity之间共享和保留数据。当从ItemDetailFragment返回到ListItemFragment时,可以通过以下步骤来保留ListItemFragment的数据:

  1. 首先,在ListItemFragment中创建一个ViewModel类,用于保存数据。ViewModel类是一个生命周期感知的组件,它可以在配置更改(如屏幕旋转)时保留数据。
代码语言:txt
复制
public class MyViewModel extends ViewModel {
    private MutableLiveData<String> data;

    public LiveData<String> getData() {
        if (data == null) {
            data = new MutableLiveData<>();
        }
        return data;
    }

    public void setData(String newData) {
        data.setValue(newData);
    }
}
  1. 在ListItemFragment中获取ViewModel实例,并观察数据的变化。
代码语言:txt
复制
public class ListItemFragment extends Fragment {
    private MyViewModel viewModel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 布局和视图初始化
        // ...

        // 观察数据的变化
        viewModel.getData().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(String newData) {
                // 更新UI显示
                // ...
            }
        });

        return view;
    }
}
  1. 在ItemDetailFragment中更新数据,并返回到ListItemFragment。
代码语言:txt
复制
public class ItemDetailFragment extends Fragment {
    private MyViewModel viewModel;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 布局和视图初始化
        // ...

        // 更新数据
        String newData = "新的数据";
        viewModel.setData(newData);

        // 返回到ListItemFragment
        requireActivity().onBackPressed();

        return view;
    }
}

通过以上步骤,当从ItemDetailFragment返回到ListItemFragment时,ListItemFragment中的数据将会被保留,并且可以在观察者中收到数据的更新通知,从而更新UI显示。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云ViewModel和LiveData相关文档:https://cloud.tencent.com/document/product/1298/47847
  • 腾讯云移动开发相关产品:https://cloud.tencent.com/solution/mobile-development
  • 腾讯云云原生相关产品:https://cloud.tencent.com/solution/cloud-native
  • 腾讯云数据库相关产品:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器运维相关产品:https://cloud.tencent.com/product/cvm
  • 腾讯云音视频相关产品:https://cloud.tencent.com/product/tcav
  • 腾讯云人工智能相关产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网相关产品:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云存储相关产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链相关产品:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙相关产品:https://cloud.tencent.com/product/ugc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

今天撸一波Jetpack下Lifecycle、ViewModelLiveData

有了它Activity或者Fragment就可以不需要承担保留数据责任了,可以把这些事情交给ViewModel,做到很好数据和视图解耦。...同时ViewModel会在configuration 更改时自动保留数据。 ? 官方给建议是将LiveDataViewModel配合来使用。...下面说明下ViewModel存在意义。 4.3 ViewModel 意义 ViewModel 被设计出来,不仅为了解决上面所说configuration改变时候能保留数据。...其真正意义在于以下几个方面: ① 职责分离:使Activity/Fragment不用再负责某些数据源获取数据,只需要负责展示数据就好,同时还消除了在配置更改时保留数据对象实例引用责任。...这两个职责都转给了ViewModel。 ② 简化对没用数据清理:当Activity/Fragment负责清理数据操作,需要使用大量代码来清理这些请求。

1.5K10

“终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

那么如何做到 因配置更改而新建Activity后数据恢复呢?...那么如何更好避免因异步请求带来内存泄漏呢? 这时候ViewModel就闪亮出场了——ViewModel用于代替MVP中Presenter,为UI层准备数据,用于解决上面两个问题。...来看下官网一张图: ? 看到在因屏幕旋转而重新创建Activity后,ViewModel对象依然会保留。只有Activity真正FinishViewModel才会被清除。...步骤: 继承ViewModel自定义MyViewModel 在MyViewModel中编写获取UI数据逻辑 使用LiveData将获取到UI数据抛出 在Activity/Fragment中使用ViewModelProvider...ViewModelLiveData数据,然后DetailFragment监听这个LiveData数据即可。

1.8K10

Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

= null } 2.3 ViewModel 如何实现不同作用域 ViewModel 内部会为不同 ViewModel 宿主分配不同 ViewModelStore 映射表,不同宿主是从不同数据源来获取...ViewModel 底层是基于原生 Activity 因设备配置变更重建恢复数据机制实现,这个其实跟 Fragment#setRetainInstance(true) 持久 Fragment 机制是相同...总结一下重建前后实例变化,帮助你理解: Activity: 构造新实例; ViewModelStore: 保留实例; ViewModel保留实例(因为 ViewModel 存储在 ViewModelStore...映射表中); LiveData保留实例(因为 LiveDataViewModel 成员变量); 现在,我们逐一分析这 3 个阶段源码执行过程: 阶段 1 源码分析: Activity.java...数据在什么时候才会清除 ViewModel 数据会在 Activity 非配置变更触发销毁清除,具体分为 3 种情况: 第 1 种: 直接调用 Activity#finish() 或返回键等间接方式

1.1K20

“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!

仓库层 要做主要工作是判断调用方请求数据应该是本地数据源中获取还是网络数据源中获取,并将获取到数据返回给调用方。...另外,注意到暴露获取LiveData方法 返回LiveData类型,即不可变,而不是MutableLiveData,好处是避免数据在外部被更改。...3.2.2 获取数据 现在,我们已使用 LiveData 将 UserListViewModel 连接到UserListActivity,那么如何获取用户个人信息列表数据呢?...现在,UserListViewModel 是不知道数据来源,因此我们可以为ViewModel提供几个不同数据源获取数据。...例如 UserRepository会将网络服务响应保存在数据库中。这样一来,对数据更改将触发对活跃 LiveData 对象回调。数据库会充当单一可信来源。 保留尽可能多相关数据和最新数据

1.9K10

浅谈ViewModel

1 主要功能 Activity、Fragment存活期间数据存储; bind同一Activity多个Fragment数据共享; 独立或与LiveData配合实现代码解耦; 2 使用方法 1) 引入...传统实现方法1:Intent +onFragmentResult() 大致流程: 跳转需要将数据按k-v封装入Bundle,或者将数据Parcelable传递给下个页面; 下个页面修改数据返回后...ViewModel+LiveData可以很方便抽象出数据层和业务层,快速解耦。 下面的Demo来自官方案例。...5 源码分析 带着两个小问题简单进行下源码分析: 1) ViewModel与Activity / Fragment映射关系是如何建立起来?...整个映射逻辑也可以简化为:通过Activity类名找ViewModel实例; 2) ViewModel生命周期如何管理?

2.6K90

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

创建一个保留 fragment 好处是这可以保存类似 image 那样大型数据集或者网络连接那样复杂对象。...Room 确保你数据库更新LiveData 被通知到。 ? 由于 Loader 在 UI 控制器中作为回调被实现,因此 ViewModel 一个额外优点是将 UI 控制器与数据加载分离开来。...一些使用 ViewModels 、LiveData 为加载数据方法: 在这篇文章中,Ian Lake 概述了如何使用 ViewModelLiveData 来代替 AsyncTaskLoader。...他们为应用其他部分提供了一套干净 API。当数据更新他们知道哪里获取数据以及调用哪个 API。你可以把他们当做是不同数据源(持久模型、web service、缓存等)之间协调员。”...在这个场景下,ViewModel 在 activity 旋转或者进入后台保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

3.7K30

开发以太坊安卓钱包系列3 - 资产信息展示

预备知识 MVVM 本文会涉及和UI界面的交互,提前理解下界面和数据如何交互是非常有必要,如果你已经很熟悉MVVM,可跳过这一小节。...View 通常对应于Activity/Fragment/自定义View Model:则是和数据相关模块。...ViewModelLiveData ViewModel 会关注UI生命周期来存储和管理数据,在Activity发生变化(锁屏开屏、旋转)ViewModel 会自动保留之前数据并给新Activity...或Fragment使用,当界面被系统销毁ViewModel也会进行资源清理,避免内存泄漏。...ViewModel 还可以用于不同界面间数据共享。 LiveData是一个可观察数据持有者类。观察者可以方便我们以异步方式获取数据,同时LiveData也是有生命周期感知

1.3K30

ViewModel:持久化、onSaveInstanceState()、UI 状态恢复和 Loader

ViewModel 允许数据在例如屏幕旋转这样配置更改后依然保留。...创建一个保留 fragment 好处是这可以保存类似 image 那样大型数据集或者网络连接那样复杂对象。...Room 确保你数据库更新LiveData 被通知到。 由于 Loader 在 UI 控制器中作为回调被实现,因此 ViewModel 一个额外优点是将 UI 控制器与数据加载分离开来。...一些使用 ViewModels 、LiveData 为加载数据方法: 在这篇文章中,Ian Lake 概述了如何使用 ViewModelLiveData 来代替 AsyncTaskLoader。...在这个场景下,ViewModel 在 activity 旋转或者进入后台保留数据,而单纯用 onSaveInstanceState() 并没那么容易实现。

94920

使用Lifecycle-Aware组件优化项目

UI相关数据 Room 使用应用内对象和编译检查来访问您应用SQLite数据库 Paging 逐步数据源加载所需信息 整体结构如下: ?...god activities和god fragments,这样很尴尬 所以引入ViewModel之后,数据就可以UI中分离出来,让每个模块职责更加清晰合理。...并且当Activity或Fragment重建时候,ViewModel会自动保留之前数据并给新Activity或Fragment使用。 ?...ViewModel生命周期 LiveData LiveData 是一个可以保存数据和观察数据变化组件。...总是最新数据——当Activity后台切到前台,总会收到最新数据。 适配设备配置变化——如屏幕旋转,组件销毁重建后,立即收到上次数据

90120

知识点 | ViewModel 四种集成方式

—— ViewModel 与导航 (Navigation) 组件库集成; ViewModel 配合数据绑定(data-binding) —— 通过使用 ViewModelLiveData 简化数据绑定...ViewModel Saved State —— 后台进程重启ViewModel 数据恢复 于 lifecycle-viewmodel-savedstate 1.0.0-alpha01 版本加入...支持 Java 和 Kotlin onSaveInstanceState 带来挑战 ViewModel 一发布,执行 onSaveInstanceState 相关逻辑如何操作 ViewModel...Activity 和 Fragment 通常会在下面三种情况下被销毁: 当前界面永久离开: 用户导航至其他界面或直接关闭 Activity (通过点击返回按钮或执行操作调用了 finish() 方法...相关逻辑; 通过配合 View Model 和导航图来精确限定数据Fragment共享范围; 使用 DataBinding 库,可以将 ViewModel 传递给数据绑定 (binding

2.5K20

Jetpack:在数据变化时如何优雅更新Views数据

三个步骤就定义了使用LiveData方式,步骤可以看出,使用了观察者模式,当LiveData对象持有数据发生变化,会通知对它订阅所有处于活跃状态订阅者。...而这些订阅者通常是UI控制器,如Activity或Fragment,以能在被通知,自动去更新Views。 创建LiveData对象 LiveData可以包装任何数据,包括集合对象。...这里通过button点击来给LiveData设置值,也可以网络或者本地数据库获取数据方式来设置值。 扩展 LiveData 可以通过下面的栗子来看看如何扩展LiveData。...LiveData会认为订阅者生命周期处于STARTED或RESUMED状态,该订阅者是活跃。 那么如何使用StockLiveData呢?...,但传递给switchMap()函数必须返回一个LiveData对象。

2.9K30

【AAC 系列四】深入理解架构组件:ViewModel

ViewModel 被设计来管理跟 UI 相关数据, 并且能够感知生命周期;另外 ViewModel 能够在配置改变情况下让数据得以保留。...ViewModel 重在以感知生命周期方式 管理界面相关数据。...看一张官网给图: ? 可以看到 ViewModel 在 Activity 重建依然存活。 Why? 4....总结 ViewModel 利用 Fragment 特性,提供给我们一个方式在特定生命周期内去管理跟 UI 相关数据;能够帮助我们把数据管理逻辑 Activity/Fragment 中剥离开。...实际上 ViewModel 不仅可以管理数据,而且还可以存放业务逻辑处理代码,另外还能够方便 Activity 中不同Fragment 之间互相通信,这个解决了以往我们 Fragment 之间通信一个大问题

88040

Android从零开始搭建MVVM架构(4)——LiveData

比如当我们使用 Retrofit+Rxjava处理接口回调数据,需要考虑activity 或 fragment 生命周期,以解决 onStop 或 onDestory之后回调数据问题。...确保Activity或Fragment一旦变为活动状态,就有可展示数据。 当应用程序组件处于STARTED状态,它就需它所观察LiveData对象中接收到最新值。...当更新数据,会生成所有必要代码来更新LiveData对象。 生成代码在需要在后台线程上异步运行查询。 这种模式对于保持用户界面中显示数据与存储在数据库中数据同步很有用。...例如,如果在UI中有一个本地数据库或网络获取更新LiveData对象,则可以将以下数据源添加到MediatorLiveData对象: 与存储在数据库中数据关联LiveData对象。...与网络访问数据关联LiveData对象。 您Activity只需观察MediatorLiveData对象即可接收来自两个数据更新。

2.2K30

知识点 | ViewModel 四种集成方式

—— ViewModel 与导航 (Navigation) 组件库集成; ViewModel 配合数据绑定(data-binding) —— 通过使用 ViewModelLiveData 简化数据绑定...ViewModel Saved State —— 后台进程重启ViewModel 数据恢复 于 lifecycle-viewmodel-savedstate 1.0.0-alpha01 版本加入...支持 Java 和 Kotlin onSaveInstanceState 带来挑战 ViewModel 一发布,执行 onSaveInstanceState 相关逻辑如何操作 ViewModel...Activity 和 Fragment 通常会在下面三种情况下被销毁: 当前界面永久离开: 用户导航至其他界面或直接关闭 Activity (通过点击返回按钮或执行操作调用了 finish() 方法...相关逻辑; 通过配合 View Model 和导航图来精确限定数据Fragment共享范围; 使用 DataBinding 库,可以将 ViewModel 传递给数据绑定 (binding

24920

再谈协程之viewmodel-livedata难兄难弟

其实隔阂绝不是一天就有的,这也许是压死LiveData最后一根稻草,Google开发者一篇公众号,就成了这跟稻草——LiveData迁移到Kotlin数据流。...❝LiveData能避免内存泄漏根本原因是它与Lifecycles绑定,在非活跃状态移除观察者,而Activity和Fragment都是LifecycleOwner,所以在Activity和Fragment...❞ ViewModel指南 ViewModel是Activity这些视图层数据容器,我们先抛开网络请求,来看下如何在Activity中使用ViewModel。...,返回ViewModel实例。...而且该协程构造器返回是一个不可变LiveData,可以直接暴露给对应UI层使用,在作用域中,可以通过emit()函数来更新LiveData数据。 这样整体流程就通了,而且,非常简单不是吗?

1.1K40

Android面试题之Kotlin Jetpack三大核心组件

ViewModelLiveData 是 Android Jetpack 组件库中两个核心组件,它们能帮助开发者更有效地管理 UI 相关数据,并且能够在配置变更(如屏幕旋转)保存和恢复 UI...用于ViewModel数据返回通知View更新,是ViewModel和View之间桥梁 那么如何在 Kotlin 中正确优雅地使用 ViewModelLiveData 呢。...创建 ViewModelViewModel 用于存储和管理与 UI 相关数据,它能在配置变更继续存在。...更新和观察数据 当通过 ViewModel 来更新数据,观察者会自动收到通知并更新相应 UI 组件。...、 LiveData,可以实现数据生命周期感知,并且在配置变更(如设备旋转)也能保持 UI 状态。

6110

ViewModelLiveData:为设计模式打 Call 还是唱反调?

假设 ViewModel 网络请求数据,然后由于某些问题,数据返回时候已经沧海桑田了。这时候,ViewModel 引用视图层可能已经被销毁或者不可见了。这将产生内存泄漏甚至引起崩溃。...视图层该如何区分被加载数据,网络错误和空列表呢? 你可以 ViewModel 中暴露出一个 LiveData 。...ViewModel 如何与其他组件进行通信取决于你,但要注意泄漏问题和边界情况。看下面这个图,其中 Presenter 层使用观察者模式,数据层使用回调: ?...任何 ViewModel 所做调用都可能是数据相关。...当 ViewModel 被移除或者视图生命周期结束,订阅被清除: ? 如果尝试这种方法,有个问题:如果无法访问 LifecycleOwner ,如何 ViewModel 中订阅数据仓库呢?

3K30
领券