当前位置: 首页 > news >正文

ViewModel快速上手1-原生kotlin

ViewModel 原生支持 kotlin 案例

基本案例

viewmodel 是为了保存当当前 activity 切出或者销毁时,如何保存数据,以便下一次创建新的 activity 时进行调用

首先引入 lifecycle 依赖
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'


之后,编写一个类继承 viewmodel,在这里配置数据的存取

我们需要实现:activity 调用该 vm,设置需要获取的水果序号,然后按照序号取出水果

代码清单 QuizViewModel.kt

package com.zhiyiyi.listviewdemo.modelimport android.util.Log
import androidx.lifecycle.ViewModelclass QuizViewModel : ViewModel() {// 初始化代码块,用于提示当前vm被调用init {Log.d("vm", "启动" + this.javaClass)}// 当当前的vm被销毁之前需要执行的方法override fun onCleared() {super.onCleared()}// 当前被选中的水果序号var currentIndex = 0// 简写get方法,获取指定序号的水果名称val getFruit: String get() = fruit[currentIndex]// 在这里存储水果数据private val fruit = listOf("apple", "pineapple", "pear", "orange", "banana")
}

viewmodel 全局仅存在一个实例,故配合懒加载,可以使用 val 定义 viewmodel 常量而非使用 var

故这里使用 by lazy 函数进行懒加载操作

因版本迭代,原 ViewModelProviders.of(this) 方法已被废弃,请使用以下代码中规定的新方法

代码清单 MainActivity.kt

package com.zhiyiyi.listviewdemoimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.zhiyiyi.listviewdemo.model.QuizViewModel
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {private val quizVM: QuizViewModel by lazy {ViewModelProvider(this).get(QuizViewModel::class.java)}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val quizVM = ViewModelProvider(this).get(QuizViewModel::class.java)btn_submit.setOnClickListener {val index = et_username.text.toString().toInt()quizVM.currentIndex = indexet_username.setText(quizVM.getFruit)}}
}

bundle 存储

当按下返回键并退出 activity 的时候,实际上该 activity 已经被销毁了; 然而直接点击主屏幕按键,只会挂起该 activity,并不会销毁它

oncreate 函数中的 savedInstanceState: Bundle? 参数还记得吗?
其中的 bundle 可看做是一个全局数据库,当 activity 被销毁后他会依然存在
利用此特性我们可以进行数据的恢复操作

因 activity 被销毁后,会调用 onSaveInstanceState 方法,而我们恰好可以为该方法传入值并存储他,当下一次 activity 被创建的时候,就可以直接取出我们存储的值

重写 onSaveInstanceState 方法,在 activity 被销毁前存储变量

override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)outState.putInt("index", quizVM.currentIndex)Log.d("vm", quizVM.currentIndex.toString())
}

在 oncreate 方法中直接从 bundle 中取出值

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val quizVM = ViewModelProvider(this).get(QuizViewModel::class.java)// 从bundle中取出值val currentIndex = savedInstanceState?.getInt("index", 0) ?: 0quizVM.currentIndex = currentIndexet_username.setText(currentIndex.toString())...
}

相关文章:

ViewModel快速上手1-原生kotlin

ViewModel 原生支持 kotlin 案例 基本案例 viewmodel 是为了保存当当前 activity 切出或者销毁时,如何保存数据,以便下一次创建新的 activity 时进行调用 首先引入 lifecycle 依赖 implementation androidx.lifecycle:lifecycle-extensions:2.2.0 之后…...

Flutter(一)介绍、Dart语言简介

Flutter介绍 纯原生开发主要面临动态化更新和开发成本两个问题,而针对这两个问题,诞生了一些跨平台的动态化框架 跨平台技术简介 Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开…...

【数据结构】---顺序表的实现

最近学校开始学习数据结构了,没事就手搓一个顺序表。🌈线性表线性表是n个具有相同特性的数据元素的有限序列,是一种实际中广泛使用的数据结构,常见的线性表有顺序表、链表、栈、队列、字符串。线性表在逻辑上是线性结构&#xff0…...

JavaScript刷LeetCode拿offer-经典高频40题vaScript刷LeetCode拿offer-经典高频40题

工作太忙没有时间刷算法题,面试的时候好心虚。这里双手奉上40道LeetCode上经典面试算法题,整理的内容有点长,建议先收藏,慢慢消化,在来年顺利拿到满意的offer。 1、[LeetCode] 两数之和 给定一个整数数组和一个目标值…...

动态规划,这将是你见过最详细的讲解

文章目录一、为什么要讲动态规划呢?二、什么是动态规划三、感受一下递归算法、备忘录算法、动态规划递归算法带备忘录的递归解法(自定向下)自底向上的动态规划四、动态规划的解题套路1. 穷举分析2. 确定边界3. 确定最优子结构4. 写出状态转移…...

【服务器数据恢复】FreeNAS层UFS2文件系统数据恢复案例

服务器数据恢复环境: Dell存储服务器,采用esxi虚拟化系统,esxi虚拟化系统里有3台虚拟机;上层iSCSI使用FreeNAS构建,通过iSCSI方式实现FCSAN功能;FreeNAS层采用UFS2文件系统。 esxi虚拟化系统里有3台虚拟机中…...

Zookeeper安装和基本使用

目录标题一、下载二、安装三、启动客户端测试四、使用zk一、下载 注意:自zk3.5.5版本以后,已编译的jar包,尾部有bin,应该使用的是apache-zookeeper-3.8.0-bin.tar.gz。,因此在下载高版本时,因该下载后缀带b…...

字节面试惨败,闭关修炼再战美团(Android 面经~)

作者:王旭 前言 本人从事Android 开发已经有5年了,受末日寒气影响,被迫在家休整,事后第一家选择字节跳动面试,无奈的被面试官虐得“体无完肤”,好在自己并未气馁,于是回家开始回家进行闭关修炼…...

【机器学习实战】七、梯度下降

梯度下降 一、线性回归 线性回归算法推导过程可以基于最小二乘法直接求解,但这并不是机器学习的思想,由此引入了梯度下降方法。本文讲解其中每一步流程与实验对比分析。 1.初始化 import numpy as np import os %matplotlib inline import matplotli…...

什么是极速文件传输,极速文件传输如何进行大文件传输

当谈到大文件传输时,人们总是担心大数据文件的大小以及将它们从一个位置交换到另一个位置需要多长时间。由于数据捕获高分辨率视频和图像的日益复杂,文件的大小不断增加。数据工作流在地理上变得越来越分散。在一个位置生成的文件在其他位置处理或使用。…...

Spring Boot 日志

目录 1.概述 2.切换日志实现 3.使用 3.1.日志级别 3.3.日志离线 3.4.详细定制 1.概述 由一些历史原因,JAVA领域存在有很多日志框架,如Log4j、Logback、log4j2。 log4j是Java日志框架的元老,在log4j被Apache Foundation收入门下之后&a…...

好用的研发管理看板工具有哪些?10款主流看板管理软件盘点

10大企业看板工具软件:1.软件开发项目看板 PingCode;2.通用看板软件 Worktile;3.开源看板软件 Wekan;4.免费看板软件 Trello;5.个人和小团队的看板软件 Todoist ;6.开源免费看 Kanboard;7.面向个…...

【软考系统架构设计师】2022下案例分析历年真题

【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题(25分)2022下案例分析历年真题第二题(25分)2022下案例分…...

Java skill - @JsonAlias 和 @JsonProperty

Java skill - JsonAlias 和 JsonPropertyJava skill系列目录:JsonAlias 和 JsonProperty使用 JsonProperty 的麻烦场景:使用 JsonAlias 应对麻烦场景:Java skill系列目录: 【Java skill - 统计耗时用StopWatch】 【Java skill - …...

【实际开发18】- 静态 3

目录 1. 调试与评估 2. 单元测试的管理 1. 单元测试的文档 3. 系统集成的模式与方法 1. 集成测试前的准备 2. 集成测试的模式 3. 大棒集成方法 ( Big-bang Integration) 4. 自顶向下和自底向上集成方法 1. 自顶向下法 ( Top-down Integration ) 2. 自底向上法 ( Bott…...

【swagger2】开发api文档

文章目录一、swagger2 简介背景Open API ???swagger2的作用swagger2常用工具组件:二、Springfox三、springBoot使用swagger2(简单示例)四、Swagger-UI使用五、配置文件1、配置类:给docket上下文配置api描述信息2、配置类&#…...

Github 上如何提交 pull request

什么是复刻(forking)? 我们可以通过复刻操作将喜爱的仓库保存自己的Github账户中,以便独立地对其进行操作。 通过复刻,我们可以得到包含完整版本历史的目标仓库的实例,之后可以对复刻得到的仓库进行任意操作而不会影响…...

Redis面试知识

概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能…...

Spring面试重点(四)——Spring事务

Spring事务 事务的方式 spring中使用事务有两种方式,一种是编程式事务,一种是声明式事务。编程式事务推荐使用TransactionTemplate,实现TransactionCallback接口,需要编码实现;声明式事务只需要在函数增加注解Transa…...

♡ — MySQL 存储引擎

MySQL 存储引擎架构 MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库设置不同的存储引擎以适应不同场景的需要;存储引擎是基于表的,而不是数据库。 MyISAM 和 InnoDB 的区别 MySQL 5.5 之前&am…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

2023赣州旅游投资集团

单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...