android jetpack databinding的基本使用(java)

news2024/9/21 4:33:13

目录

  • databing的基本使用
  • 二级页面的绑定
  • 自定义BindingAdapter
  • 自定义BinddingAdapter的可选旧值
  • 双向绑定
    • 使用ObservableField来进行双向绑定
  • 在recycleview中使用databinding

databing的基本使用

  1. 开启databing
android {
	........

    dataBinding{

        enable = true
    }
}
  1. 修改布局文件
    为布局文件添加<layout>标签。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/main_tv_word"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="句子" />

        <TextView
            android:id="@+id/main_tv_def"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="句子2" />



    </LinearLayout>
</layout>
  1. 实例化布局文件
    ActivityMainBinding activityMainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    }
  1. 向布局文件传递数据

创建一个Sentence 类,实例化。传给布局并显示。

public class Sentence {

    private String sentence;


    private String sentenceCH;


	getter/setter......
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/main_tv_word"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="@{sentence.sentence}" />

        <TextView
            android:id="@+id/main_tv_def"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="@{sentence.sentenceCH}" />


    </LinearLayout>
</layout>
    ActivityMainBinding activityMainBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        Sentence sentence = new Sentence();
        sentence.setSentence("Hello");
        sentence.setSentenceCH("你好");
        activityMainBinding.setSentence(sentence);

    }

在这里插入图片描述 5. 在布局中引用静态类
在sentence类中添加属性collect ,collect 等于1表示已收藏,0表示收藏。
建立工具类CollectUtil

public class CollectUtil {
    public static String getCollectString(int collect) {

        if (collect == 1) {

            return "已收藏";
        } else {

            return "未收藏";
        }
    }
}

通过<import>导入到布局文件中

    <data>

        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />

        <import type="cn.jn.mytest.util.CollectUtil" />
    </data>

调用CollectUtil

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />

        <import type="cn.jn.mytest.util.CollectUtil" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/main_tv_word"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="@{sentence.sentence}" />

        <TextView
            android:id="@+id/main_tv_def"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="@{sentence.sentenceCH}" />


        <TextView
            android:id="@+id/main_tv_collect"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp"
            android:text="@{CollectUtil.getCollectString(sentence.collect)}" />


    </LinearLayout>
</layout>

在这里插入图片描述

二级页面的绑定

当我们在activity或者fragment的布局中,使用<include>引入的布局叫二级页面。

一级页面


    <data>

        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />

        <import type="cn.jn.mytest.util.CollectUtil" />
    </data>
   <include
            layout="@layout/toolbar"
            app:sentence="@{sentence}" />

二级页面需要创建个相同名字的变量

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/toolbar_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{sentence.sentence}" />

    </LinearLayout>
</layout>

自定义BindingAdapter

bindingadapter中的方法都是静态方法,需要添加@BindingAdapter,第一个参数为控件本身,第二个参数是布局文件传过来参数,

public class TextBindingAdapter {
    @BindingAdapter("collect")
    public static void setCollect(TextView textView, int collect) {

        if (collect == 1) {

            textView.setTextColor(Color.GREEN);
            textView.setText("已收藏");
        } else {

            textView.setTextColor(Color.GRAY);
            textView.setText("未收藏");
        }
    }
}	
        <TextView
            android:id="@+id/main_tv_collect"
            collect="@{sentence.collect}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp" />

在这里插入图片描述

自定义BinddingAdapter的可选旧值

oldcollect是旧值,newCollect是新值。可以用来防止重复调用。

    @BindingAdapter("collect")
    public static void setCollect(TextView textView, int oldCollect, int newCollect) {


        if (oldCollect == newCollect) {

            return;
        }

        if (newCollect == 1) {

            textView.setTextColor(Color.GREEN);
            textView.setText("已收藏");
        } else {

            textView.setTextColor(Color.GRAY);
            textView.setText("未收藏");
        }
    }
        <TextView
            android:id="@+id/main_tv_collect"
            collect="@{sentence.collect}"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="13dp" />

双向绑定

前面的所涉及的绑定是单向绑定,根据字段来更新控件的内容。
通过交互修改edittext 的内容,使得对应的字段自动更新。
实现

public class NameModel {

    public String name;
}

创建一个双向绑定的业务逻辑类,继承BaseObservable 。给getter添加@Bindable,对字段进行双向绑定。setter方法会在用户编辑edittext时自动调用,内容更新后,会调用notifyPropertyChanged方法,通知观察者,数据已更新,更新ui。

public class NameViewModel extends BaseObservable {

    private NameModel nameModel;


    public NameViewModel() {

        nameModel = new NameModel();
        nameModel.name = "zhang san";
    }


    @Bindable
    public String getName() {


        return nameModel.name;
    }

    public void setName(String name) {

            nameModel.name = name;
            notifyPropertyChanged(BR.name);
    }
}

在布局中的使用,@{}变乘@={}。
main_tt_name2是textview,这个为了调用notifyPropertyChanged后,能够直观的看到内容变化。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="nameViewModel"
            type="cn.jn.mytest.observable.NameViewModel" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


        <EditText
            android:id="@+id/main_et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={nameViewModel.name}" />

        <TextView
            android:id="@+id/main_tt_name2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{nameViewModel.name}" />

    </LinearLayout>
</layout>

效果图
在这里插入图片描述

使用ObservableField来进行双向绑定

public class NameViewModel2 {


    private ObservableField<NameModel> nameModelObservableField;


    public NameViewModel2() {

        NameModel nameModel = new NameModel();
        nameModel.name = "zhang san";

        nameModelObservableField = new ObservableField<>();
        nameModelObservableField.set(nameModel);

    }


    public String getName() {

        return nameModelObservableField.get().name;
    }

    public void setName(String name) {

        nameModelObservableField.get().name = name;
    }

}

布局,main_tt_name2在这里不起作用,所以添加了button来获取值。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="nameViewModel"
            type="cn.jn.mytest.observable.NameViewModel2" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">


        <EditText
            android:id="@+id/main_et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={nameViewModel.name}" />

        <TextView
            android:id="@+id/main_tt_name2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{nameViewModel.name}" />

        <Button
            android:id="@+id/main_but_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="获取名字" />

    </LinearLayout>
</layout>

效果图
在这里插入图片描述
在这里插入图片描述

在recycleview中使用databinding

item的布局文件

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="sentence"
            type="cn.jn.mytest.entity.Sentence" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/sentence_tv_sentence"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{sentence.sentence}" />

        <TextView
            android:id="@+id/sentence_tv_sentence_ch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{sentence.sentenceCH}" />


    </LinearLayout>
</layout>

适配器

public class SentenceAdapter extends RecyclerView.Adapter<SentenceAdapter.SentenceViewHolder> {

    private List<Sentence> sentenceList;


    public SentenceAdapter(List<Sentence> sentenceList) {
        this.sentenceList = sentenceList;
    }

    @NonNull
    @Override
    public SentenceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        ItemSentenceBinding itemSentenceBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_sentence, parent, false);
        return new SentenceViewHolder(itemSentenceBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull SentenceViewHolder holder, int position) {

        Sentence sentence = sentenceList.get(position);
        holder.itemSentenceBinding.setSentence(sentence);
    }

    @Override
    public int getItemCount() {
        return sentenceList.size();
    }

    public static class SentenceViewHolder extends RecyclerView.ViewHolder {

        ItemSentenceBinding itemSentenceBinding;

        public SentenceViewHolder(@NonNull ItemSentenceBinding itemView) {
            super(itemView.getRoot());
            this.itemSentenceBinding = itemView;
        }
    }
}

使用

        List<Sentence> sentenceList = new ArrayList<>();
        sentenceList.add(new Sentence("hello", "你好", 0));
        sentenceList.add(new Sentence("His trousers are the same as mine.", "他的裤子和我的一样。", 0));
        sentenceList.add(new Sentence("Let him not stand in the rain.", "让他不要站在雨中。", 0));

        RecyclerView main_rv_list = findViewById(R.id.main_rv_list);

        main_rv_list.setLayoutManager(new LinearLayoutManager(this));
        SentenceAdapter sentenceAdapter = new SentenceAdapter(sentenceList);
        main_rv_list.setAdapter(sentenceAdapter);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity UGUI6——UGUI进阶

一、UI 事件监听接口 ​ 目前所有的控件都只提供了常用的事件监听列表 ​ 如果想做一些类似长按&#xff0c;双击&#xff0c;拖拽等功能是无法制作的&#xff0c;或者想让 Image 和 Text&#xff0c;RawImage 三大基础控件能够响应玩家输入也是无法制作的 ​ 而事件接口就是…

Elasticsearch 基本使用(三)条件查询

条件查询 单条件查询matchdebug 查看分词结果match_phrase 多条件查询bool 子元素区别 单条件查询 match match 匹配字段&#xff0c;会对条件分词&#xff0c;然后每个词以or的关系在文档倒排索引内进行查询 GET bank/_search {"query": {"match": {&q…

一起学SF框架系列6.1-模块core-Resource

Java虽然提供了java.net.URL类和各种URL前缀处理程序来负责处理对各种资源的访问&#xff0c;但对于低级别资源的访问来说还是不够充分。例如&#xff0c;没有标准化的实现可用于访问需要从类路径中获取或者相对于一个ServletContext的资源&#xff1b;也没有检查所指向的资源是…

火影手游 问答题小抄

文章目录 Part.I IntroductionPart.II 一些常识Chap.I 基础常识Chap.II 人物相关Chap.III 原作相关Chap.III 游戏相关 Part.III 奥义 & 技能Chap.I S 忍Chap.II A 忍Chap.III B 忍Chap.IV C 忍 Part.IV 针对活动Chap.I 组织樱花祭Chap.II 樱花问答 Pary.V 名言Reference Pa…

群辉DSM7.2安装svn服务

Part1前言 今天研究了一晚上使用群辉安装svn&#xff0c;确实挺多坑的&#xff0c;总结记录一下。我的型号是DS220&#xff0c;版本为DSM 7.2 Part2安装docker 首先打开套件中心&#xff0c;如下图&#xff0c;检索docker 然后点击安装&#xff0c;安装之后打开如下&#xff1a…

Clickhouse之物化视图分享

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

【TOP生物信息】基于Scanpy的单细胞数据质控、聚类、标注

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 「写在前面」 Python作为一种高级编程语言&#xff0c;被广泛用于单细胞数据分析&#xff0c;有着以下的优势&#xff1a; 「大量的生物信息学库&#xff1a;」 Python拥有大量的…

【UE 从零开始制作坦克】6-坦克开炮

效果 步骤 1. 添加初学者内容包&#xff08;需要用到其中的音效和粒子效果&#xff09; 2. 接下来制作坦克的炮弹 首先新建一个Actor蓝图类&#xff0c;作为所有发射物体&#xff08;炮弹、机枪子弹等&#xff09;的父类&#xff0c;这里命名为“TotalCategoryOfProjectile”…

从清华高材生拿到百万年薪offer说起

这几天在脉脉上看到一个很火的帖子&#xff0c;帖子内容是一位清华姚班毕业的博士&#xff0c;透露其拿到「亚马逊应用科学家」的offer&#xff0c;Base 110k/月&#xff0b;股票400K分四年给&#xff0c;还有195k的签字费。 清华姚班毕业薪资 看到这张截图博主留下了羡慕的泪…

搞懂了,React 中原来要这样测试自定义 Hooks

React 中自定义的 Hooks 为开发者提供了重用公共方法的能力。然而&#xff0c;如果你是一个测试新手的话&#xff0c;测试这些钩子可能会很棘手。本文中&#xff0c;我们将探索如何使用 React Testing Library 测试库来测试自定义钩子。 如何测试 React 组件 开始前&#xff…

【统计模型】生存分析基本知识介绍

目录 一、生存分析介绍 1.生存分析用途 2.传统方法在分析随访资料时的困难 &#xff08;1&#xff09;生存时间和生存结局都是我们关心的因素 &#xff08;2&#xff09;存在大量失访 &#xff08;3&#xff09;显然&#xff0c;将失访数据无论是算作死亡还是存活都不合理…

CSS基础学习--20 提示工具(Tooltip)

一、定义 提示工具在鼠标移动到指定元素后触发&#xff0c;总共四种样式实例&#xff1a; 二、基础提示框(Tooltip) 提示框在鼠标移动到指定元素上显示 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>CSS基础学习-提…

【RV1126】IIC驱动--EEPROM

文章目录 原理图查找空闲的I2CEEPROM芯片改设备树编写驱动驱动端设备端驱动端和设备端编译成驱动模块应用层的测试代码 原理图查找空闲的I2C 由上面可以知道&#xff0c;空闲了I2C4接口&#xff0c;然后也引出来了。 再找原理图找到具体引脚&#xff1a; I2C4_SCL&#xff1…

第 5 章 机器学习技术的应用(下)

全文目录 机器学习技术的实施方法 预测阶段效果监控 离线预测在线预测 监控点击率的稳定性 真实点击率的稳定性 计算相邻两个区间内点击率分布的 PSI(Population Stability Index, 群体稳定性指标), 小于 0.1 可认为数据相对稳定;预测点击率的稳定性 与系统本身和用户发生变…

Dice Loss

导读 ​ Dice Loss是由 Dice 系数而得名的&#xff0c;Dice系数是一种用于评估两个样本相似性的度量函数&#xff0c;其值越大意味着这两个样本越相似&#xff0c;Dice系数的数学表达式如下&#xff1a; Dice 2 ∣ X ∩ Y ∣ ∣ X ∣ ∣ Y ∣ \text { Dice }\frac{2|X \ca…

Windows10完全卸载oracle19c

Windows10完全卸载oracle19c 1.停止服务2.卸载产品3.清理注册表4.清理环境变量5.清理文件夹 1.停止服务 winR输入service.msc进入服务列表&#xff0c;停止所有的服务 2.卸载产品 点击开始菜找到Oracle&#xff0c;然后点击Oracle安装产品&#xff0c;再点击Universal Inst…

如何安装PHP框架

目录 什么是PHP框架 第一步 安装PHP依赖包 第二步 导入PHP相关包 第三步 解包并切换进指定目录 第四步 在PHP目录内编译安装 第五步 编译 第六步 拷贝配置文件进行编辑 第七步 修改时区 第八步 修改文件指定路径 第九步 将命令加入指定目录进行识别 第十步 进入配置…

【Flutter】Audioplayers 4.1.0 简要使用说明

文章目录 一、前言二、安装和设置三、基本使用1.创建 AudioPlayer 实例2.设置音频源3.控制播放 四、示例代码五、总结 一、前言 Audioplayers 是一个非常实用的 Flutter 插件&#xff0c;它可以帮助我们在 Flutter 应用中播放音频。无论你是想在你的应用中添加背景音乐&#x…

【Python】在同一图形中更加优雅地绘制多个子图

1. 引言 数据可视化非常重要&#xff0c;有一句俗语叫做一图顶千言&#xff0c;我相信好多小伙伴应该都听说过这句话&#xff1b;即使是有人第一次听到&#xff0c;我想应该也会觉得赞成&#xff0c;这足以说明数据可视化的重要性。我们在前一篇博客中&#xff0c;介绍了如何利…

C语言基础 位域

C语言基础&#xff1a;位域 主题&#xff1a;位域&#xff08;bit-field&#xff09; 关键字&#xff1a;位域 冒号 结构体 存储空间 参考链接&#xff1a;C语言中文网&#xff1a;位域 、C菜鸟工具&#xff08;在线编译器&#xff09;、位域知乎问答 注&#xff1a;以下内容中…