我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Android开发基础】Fragment(碎片)中ViewModel的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Android开发基础】Fragment(碎片)中ViewModel的使用

文章目录

一、简述

  • 描述:当Activity / Fragment数据处理量大时,一个XXActivity.java / XXFragment.java里就会有庞大的数据量。而这两者的主要作用应该是起到连接UI控件、渲染数据的作用,所以这就违背“单一负责”原则,那么数据就应该单独进行存放以及读取。为此Android官方就为开发者提供了ViewModel类。
  • 难度:初级
  • 知识点:
  • 1、了解Java中数据存储地址的概念(逻辑 and 物理)
  • 2、了解软件体系结构里的观察者模式
  • 3、适配器(Adapter)的使用
  • 4、认识ViewModel

二、创建ViewModel

为了使文章简洁,这里就直接使用Android studio配置好了的Bottom Navigation Activity

在这里插入图片描述

创建好工程后,就可以看到已经配置好了的ViewModel

在这里插入图片描述

三、了解LiveData

LiveData对于初学者而言,还是比较难以理解,这里会用就好了。
主要作用:通知Observe类将最新数据传递给渲染方法(和Vue里的双向绑定v-model有异曲同工之妙),实体类里通过postValue(this)监听数据变化,这在软件体系结构里被称为观察者模式

ViewModel观察者模式

四、使用ViewModel

1、单体数据

如,创建初始的样子

在这里插入图片描述

这个很简单,直接跳过,平常就可以按照这个模板来。

在这里插入图片描述

2、实体类数据

很显然,任何在应用商店的Android app,不可能只是对单一数据进行渲染。必然牵扯到实体类数据(服务器发送json -> Android接收json -> json转实体)

(1)创建LiveData实体

这里以商品实体类为例(这是后面将写的博客购物车功能模块的实体类)

import androidx.lifecycle.LiveData;public class Shop extends LiveData<Shop> {    int id;    String image;    String name;    int price;    String bus;    float dis;    String time;    String des;    public int getId() {        return id;    }    public String getImage() {        return image;    }    public String getName() {        return name;    }    public int getPrice() {        return price;    }    public String getBus() {        return bus;    }    public float getDis() {        return dis;    }    public String getTime() {        return time;    }    public String getDes() {        return des;    }    public void setId(int id) {        this.id = id;        postValue(this);    }    public void setImage(String image) {        this.image = image;        postValue(this);    }    public void setName(String name) {        this.name = name;        postValue(this);    }    public void setPrice(int price) {        this.price = price;        postValue(this);    }    public void setBus(String bus) {        this.bus = bus;        postValue(this);    }    public void setDis(float dis) {        this.dis = dis;        postValue(this);    }    public void setTime(String time) {        this.time = time;        postValue(this);    }    public void setDes(String des) {        this.des = des;        postValue(this);    }}
(2)编写ViewModel

这里以模板里的HomeFragment和HomeViewModel为例

  • HomeViewModel.java
import androidx.lifecycle.ViewModel;import com.hngy.xpq.shoppingcartmodule.bean.Shop;import java.util.ArrayList;import java.util.List;public class HomeViewModel extends ViewModel {    private Shop shop = new Shop();    private List<Shop> ls;        public List<Shop> getListShop() {        ls = new ArrayList<>();        // 这里是获取数据,一般有三种方式        // 1、手动填充数据(测试)        // 2、HTTP获取服务器数据        // 3、本地数据库存储的数据        for (int i = 0; i < 5;i++) {            Shop s = new Shop();            s.setName("name" + i);            s.setPrice(10 + i);            s.setBus("商家" + i);            s.setDis(Float.valueOf("2.55") + i);            s.setTime("周" + i);            s.setDes("无");            ls.add(s);        }        // ------------end---------- //        return ls;    }    // 测试数据的改变,会不会影响视图显示的数据    public void xg() {        // 修改数据(不通过setText方法)        // 需要明白 Java数据地址原理        ls.get(1).setName("ViewModel绑定数据修改!");    }}
  • HomeFragment.java

学习此节前,需要先学习栏目【Android开发基础】三种常见的适配器(Adapter)中List适配器。也可以复制附件中关于适配器的代码

在这里插入图片描述

    private RecyclerView listShop;    private List<Shop> shopList;    private void init(View root) {        shopList = homeViewModel.getListShop();        listShop = root.findViewById(R.id.listShop);        getListAdapter();    // 数据渲染        homeViewModel.xg();  // 修改数据    }    // List适配器    private void getListAdapter() {        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);        listShop.setLayoutManager(layoutManager);        ListAdapter adapter = new ListAdapter(shopList);        listShop.setAdapter(adapter);    }
  • 效果
    在这里插入图片描述

五、附件

1、适配器UI界面设计代码

item_list.xml

<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="15dp"    android:orientation="horizontal">    <ImageView        android:id="@+id/homeImage"        android:layout_width="120dp"        android:layout_height="120dp"        android:background="@drawable/ic_launcher_background"/>    <TextView        android:id="@+id/homeName"        android:layout_width="match_parent"        android:layout_height="25dp"        android:layout_marginLeft="18dp"        android:layout_toEndOf="@+id/homeImage"        android:textSize="50px"/>    <TextView        android:id="@+id/homeTime"        android:layout_width="150dp"        android:layout_height="25dp"        android:layout_below="@+id/homeName"        android:layout_marginStart="16dp"        android:layout_marginLeft="18dp"        android:layout_marginTop="5dp"        android:layout_toEndOf="@+id/homeImage"        android:textSize="50px" />    <TextView        android:id="@+id/homeDes"        android:layout_width="150dp"        android:layout_height="25dp"        android:layout_below="@+id/homeTime"        android:layout_marginStart="16dp"        android:layout_marginLeft="18dp"        android:layout_marginTop="5dp"        android:layout_toEndOf="@+id/homeImage"        android:textSize="50px" />    <TextView        android:id="@+id/homePrice"        android:layout_width="150dp"        android:layout_height="25dp"        android:layout_below="@+id/homeDes"        android:layout_marginStart="16dp"        android:layout_marginLeft="18dp"        android:layout_marginTop="5dp"        android:layout_toEndOf="@+id/homeImage"        android:textSize="50px" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="120dp"        android:gravity="bottom|right"        android:paddingBottom="20dp">        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="加入"/>    LinearLayout>RelativeLayout>

2、适配器数据绑定代码

ListAdapter.java

import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.recyclerview.widget.RecyclerView;import com.hngy.xpq.shoppingcartmodule.R;import com.hngy.xpq.shoppingcartmodule.bean.Shop;import java.util.List;public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {    private List<Shop> listData;    static class ViewHolder extends RecyclerView.ViewHolder {        View fileView;        ImageView image;        TextView name, price, dis, time, des;        public ViewHolder(View itemView) {            super(itemView);            fileView = itemView;            name = itemView.findViewById(R.id.homeName);            price = itemView.findViewById(R.id.homePrice);            time = itemView.findViewById(R.id.homeTime);            des = itemView.findViewById(R.id.homeDes);        }    }    // 获取到数据    public ListAdapter(List<Shop> list) {        this.listData = list;    }    @NonNull    @Override    public ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list,parent,false);        final ViewHolder holder = new ViewHolder(view);        return holder;    }    @Override    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {        // 数据绑定        final Shop s = listData.get(position);        holder.name.setText(s.getName());        holder.price.setText("¥" + s.getPrice());        holder.time.setText(s.getTime());        holder.des.setText(s.getDes());    }    @Override    public int getItemCount() {        return listData.size();    }}

来源地址:https://blog.csdn.net/weixin_48916759/article/details/130633430

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Android开发基础】Fragment(碎片)中ViewModel的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android应用开发中Fragment存储功能的基本用法

一、引言 在移动应用程序的架构设计中,界面与数据即不可分割又不可混淆。在绝大部分的开发经历中,我们都是使用Fragment来进行界面编程,即使保存数据基本上也只是界面相关控件的数据,很少做其他的数据保存,毕竟这样与开发原则相背,而今天这一篇
2022-06-06

Android开发笔记之Fragment的使用教程

我们的Android入门一步步已经进入中级,我们讲完了所有的基本组件的基本使用、Activity、Service、BroadCast,今天我们来介绍一下Fragment的使用教程,需要的朋友可以参考下
2023-05-19

Android应用开发中使用Fragment的入门学习教程

Fragment是Android honeycomb 3.0开始新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法。Fragment用来描述一些行为或一部分用户界
2022-06-06

Android开发基础 几种常用对话框的使用

Android开发基础 几种常用对话框的使用 开发步骤如下:(1)布局界面(2)获取按钮,添加事件监听器,实现对话框 。 我采用的是RelativeLayout布局和LinearLayout两个布局,自定义对话框用的是用的是在Layout下
2022-06-06

Android使用JetpackCompose开发零基础起步教程

JetpackCompose是用于构建原生AndroidUI的现代工具包。JetpackCompose使用更少的代码,强大的工具和直观的KotlinAPI,简化并加速了Android上的UI开发
2023-05-15

Android应用UI开发中Fragment的常见用法小结

1.Fragment概述 在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象。一个Fr
2022-06-06

Android应用开发中Fragment间通信的实现教程

为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块化。一旦你定义了这些可重用的Fragment,你可以通过Activity将它们关联起来并通过程序的逻
2022-06-06

Android开发基础使用ProgressBar加载进度条示例

这篇文章主要介绍了安卓开发基础使用ProgressBar加载进度条示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-05

实例讲解Android应用开发中Fragment生命周期的控制

一、Fragment的生命周期初探 因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。 如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果
2022-06-06

Android App开发中RecyclerView控件的基本使用教程

概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、G
2022-06-06

Android应用开发中Fragment的静态加载与动态加载实例

1、Fragment的静态使用 Fragment是作为Activity的UI的一部分,它内嵌在Activity中,多个Fragment可以把一个Activity分成多个部分,这在大屏幕手机或者平板电脑中会比较多的用到,这样就不用使用多个Ac
2022-06-06

Android开发之使用GridView展示图片的方法

本文实例讲述了Android使用GridView展示图片的方法。分享给大家供大家参考,具体如下: 今天说说GridView的使用。 所谓GvidView翻译过来就是网格布局:是一个ViewGroup以网格显示它的子视图(view)元素,即二
2022-06-06

举例讲解Android应用开发中OTTO框架的基本使用

OTTO是一个EventBus类型的事件传输总线,它可以提供“存储转发”的功能,让你APP中各个组件的交流更加便利,让你的程序分层更加清晰。 使用场景 OTTO基于Observer设计模式。它有发布者,订阅者这两个主要对象。OTTO的最佳实
2022-06-06

Android中使用开源框架eventbus3.0实现fragment之间的通信交互

1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:《Android中Fragment与Activity之间的交互(两种实现方式)》,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus。(相比于hand
2022-06-06

实例讲解Android app开发中ListView的基本使用及优化

一、直接使用ListView组件创建 1.直接在XML中创建ListView用entries属性附上一个数组资源 其中divider属性是设置分割线可以使用颜色和drawable资源分割
2022-06-06

详解Android开发中ContentObserver类的使用

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发
2022-06-06

在Android开发中使用Dagger2的方法

在Android开发中使用Dagger2的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用方法如下:@Component(modules = MyAppModule.cl
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录