Android开发之关于MVVM架构中视图数据绑定框架dataBinding的基本用法
dataBinding是Google官方开发的第三方视图数据绑定框架。优缺点如下:
优点:很好用
缺点:调试bug不易,部分AS版本中不太友好
首先说下如何使用:
在gradle中的android模块中添加 如下命令:
dataBinding {enabled = true}
如下图
然后将你要绑定的xml布局视图转换成Binding视图:
开始将bean对象放到xml布局中
然后通过dataBinding加载此布局:
DataBindingUtil.setContentView(this, R.layout.activity_home);
上面会返回一个dataBinding类型的对象ActivityHomeBinding这里说明下:这个返回的对象的名称是根据activity_home名称决定的。例如xml布局叫activity_page,那么返回的dataBinding类型就为ActivityPageBinding这个规则了。
然后可以拿到这个返回的对象去设置数据了
activityHomeBinding = DataBindingUtil.setContentView(this, R.layout.activity_home);people.setWork("高级移动金砖工程师");peopleMessage.setAddress("东直门");peopleMessage.setAge(21);peopleMessage.setName("李晓华");people.setPeopleMessage(peopleMessage);activityHomeBinding.setPeople(people);
当然也可以用这个返回的对象去调用xml布局中的id:例如
activityHomeBinding.tvShowPeople
上面的tvShowPeople就是xml中的tv_show_people这个id
如何更新数据呢?
我们需要在xml中这样写
重点代码
<TextViewandroid:id="@+id/tv_show_people"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{people.peopleMessage.name+':'+people.work+':'+people.peopleMessage.age+':'+people.peopleMessage.address}"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />
数据绑定的规则:@{},这个大括号里面的就是我们设置的数据,people就是上面xml布局中的data标签中的name字段,people.work代表的是获取com.example.databindingdemo.bean.People这个路径下面的bean对象里面的work字段,其它字段同理
因为我们上面已经设置了people的基本参数了
这样数据就绑定了。项目跑起来就会显示刚刚设置的people数据了
我们再来看下更新数据:
首先在xml中定义点击事件onClick,下面红框里面的home.Onclick这个方法名称随意写
然后在activity中写好刚刚定义的Onclick方法:更新数据就是重新复制给people即可,在将重新复制的people赋值给binding那个对象即可
但是每次都要重新将复制的people赋值给binding那个对象太麻烦。
所以我们使用新方法,在bean对象里面使用注解:
1.首先类名要继承BaseObservable
2.在要更新同步数据的方法上面添加@Bindable注解
3.刷新数据这个方法notifyPropertyChanged(BR.更新的字段);
可能有点乱,但是对比源码看可能好点:GitHub源码下载
更新了添加kotlin经典绑定代码示例:
package com.noboauto.module_album.adapterimport android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.noboauto.module_album.databinding.AlbumItemFragmentCategoryHomeListBinding
import com.noboauto.xm_api.http.data.album.XmAlbum
import java.text.DecimalFormat/*** 项目名称 : Radio* 项目路径 : com.module_album.adapter* 当前作者 : xiayiye5* 创建时间 : 2021/9/2 13:57*/
class RadioCategoryAdapter(private var categoryItemData: List<XmAlbum>) :RecyclerView.Adapter<RadioCategoryAdapter.RadioCategoryHolder>() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RadioCategoryHolder {val albumItemBinding = AlbumItemFragmentCategoryHomeListBinding.inflate(LayoutInflater.from(parent.context),parent,false)return RadioCategoryHolder(albumItemBinding)}override fun onBindViewHolder(holder: RadioCategoryHolder, position: Int) {//使用viewbinding设置数据给bean对象,在xml中拿到bean对象后就可以直接设置数据了holder.albumItemBinding.xmAlbum = categoryItemData[position]//将当前adapter实例对象传递给databinding布局,拿到后可以调用adapter里面的两个方法 //countNumber和showRadioNumberholder.albumItemBinding.adapter = this@RadioCategoryAdapter}override fun getItemCount(): Int {return if (categoryItemData.isEmpty()) 0 else categoryItemData.size}fun showData(it: List<XmAlbum>) {categoryItemData = itnotifyDataSetChanged()}class RadioCategoryHolder(val albumItemBinding: AlbumItemFragmentCategoryHomeListBinding) :RecyclerView.ViewHolder(albumItemBinding.root) {}fun countNumber(number: Long): String {val format = DecimalFormat("#.##").format(number / 10000f)return if (number < 10000) number.toString() else "${format}万"}fun showRadioNumber(itemData: XmAlbum): String = "${itemData.free_track_count}集"
}
再看下xml布局
<?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><variablename="xmAlbum"type="com.noboauto.xm_api.http.data.album.XmAlbum" /><variablename="adapter"type="com.noboauto.module_album.adapter.RadioCategoryAdapter" /></data><androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="15dp"android:background="@color/album_test_color_1"android:padding="15dp"><ImageViewandroid:id="@+id/iv_category_home_list_item_icon"bindingImage="@{xmAlbum.announcer.avatar_url}"android:layout_width="100dp"android:layout_height="100dp"android:src="@drawable/abc_vector_test"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_category_home_list_item_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="15dp"android:singleLine="true"android:text="@{xmAlbum.title}"app:layout_constraintStart_toEndOf="@+id/iv_category_home_list_item_icon"app:layout_constraintTop_toTopOf="@+id/iv_category_home_list_item_icon" /><TextViewandroid:id="@+id/tv_category_home_list_item_play_number"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="15dp"android:drawableLeft="@drawable/abc_vector_test"android:gravity="center"android:text="@{adapter.countNumber(xmAlbum.play_count)}"app:layout_constraintBottom_toTopOf="@+id/tv_category_home_list_item_author_name"app:layout_constraintStart_toEndOf="@+id/iv_category_home_list_item_icon"app:layout_constraintTop_toBottomOf="@+id/tv_category_home_list_item_title" /><TextViewandroid:id="@+id/tv_category_home_list_item_des"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="15dp"android:drawableLeft="@drawable/abc_vector_test"android:gravity="center"android:singleLine="true"android:text="@{adapter.showRadioNumber(xmAlbum)}"app:layout_constraintBottom_toBottomOf="@+id/tv_category_home_list_item_play_number"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="@+id/tv_category_home_list_item_play_number" /><TextViewandroid:id="@+id/tv_category_home_list_item_author_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="15dp"android:drawableLeft="@drawable/abc_vector_test"android:singleLine="true"android:text="@{xmAlbum.announcer.nickname}"app:layout_constraintBottom_toBottomOf="@+id/iv_category_home_list_item_icon"app:layout_constraintStart_toEndOf="@+id/iv_category_home_list_item_icon" /></androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Android开发之关于MVVM架构中视图数据绑定框架dataBinding的基本用法相关推荐
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- Android数据绑定框架DataBinding用法
Android数据绑定框架DataBinding用法 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/5195374 ...
- Android官方数据绑定框架DataBinding(二)
继续上篇的博客<Android官方数据绑定框架DataBinding(一)>我们继续学习Data Binding的使用. 十.inflate 不知道大家注意没有,上面的代码我们都是在act ...
- Android开发模式万佛朝中MVX(MVC、MVP、MVVM)
今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...
- sharedpreferences使用方法_Google 推荐在 MVVM 架构中使用 Kotlin Flow
前言 在之前分享过一篇 Jetpack 综合实战应用 Jetpack 实战:神奇宝贝 ,这个项目主要包了以下功能: 自定义 RemoteMediator 实现 network + db 的混合使用 ( ...
- 云炬Android开发笔记 3-1项目架构初始化
一.项目架构初始化 1.我们的应用只有一个activity,它里面是多个fragment进行切换的,这样的好处是应用会非常顺滑,并且一个activity也可以进行很多全局的处理. 在类前加上final ...
- Android开发笔记(十一)自定义视图的构造方法
自定义视图的用法 Android自带的视图常常不能满足实际开发的需求,这种情况下我们就得自定义视图(View). 首先在res\values目录下找到attrs.xml(如没有则创建之),在该属性定义 ...
- 【Android 开发入门】我认识中的Android
2014年12月从csdn专家福利获得的一本书<Android游戏开发技术实战详解>,尘封了一年多的时间,今天才翻开来看. 我认识中的Android,提到Android最先浮现在我脑海中的 ...
- 浅析域控制器开发在商用车架构中的设置与应用
本文由赵光辉,丁万兴联合创作 当前国内主流商用车大多根据功能需要采用独立的控制器来负责信号采集.逻辑处理.指令输出等任务,每增加一项功能,就配套增加一个相应的控制器,车辆上控制器的数量可以代表电子功能 ...
最新文章
- 混合云存储跨云灾备方案之跨云容灾
- pta段错误怎么办_语文名师提醒:错误的阅读习惯导致孩子成绩下降
- 再见 2020!Apache RocketMQ 发布 4.8.0,DLedger 模式全面提升!
- 2更新字段其中一位_NoSQL之MongoDB——数据更新操作
- php网页制作 博客,php响应式的个人博客网站设计
- ASP.NET Core MVC 配置全局路由前缀
- 【CF1349D】Slime and Biscuits【概率期望】【解方程】
- java概述_Java 7功能概述
- Spring MVC 生成文件类型响应
- 在Android工程中,添加ICON资源
- 公因式的概念_公因式概念论文,关于也淡化概念相关参考文献资料-免费论文范文...
- ArrayList源码详解篇
- av终结者特征及防治方法
- 2021-2027全球及中国油田钻机行业研究及十四五规划分析报告
- 校招——2021多益网络软件开发笔试和面试
- 测试用例设计-淘宝购物车,微信发红包
- SQL语句,数据库增加、删除、修改、查询
- 陈安之励志演讲经典句子
- 一个失败创业者的告白
- Excel表格如何保存为网页形式
热门文章
- 成功解决tensorflow.keras: AttributeError: ‘str‘ object has no attribute ‘decode‘
- php字符串处理面试题,关于PHP字符串的一道面试题
- eclipse中无法移除jar包_IDEA中已配置阿里镜像,但maven无法下载jar包的问题
- 千本樱计算机音乐谱,【C型】我来发几个谱子 【千本樱】【权御天下】
- upload_labs_pass17_二次渲染
- php sodium 加密解密,sodium库(加密)
- 下一代CC++测试框架TestNG++入门指导【转】
- 2019.6.16完成classstack任务
- git命令之git mergetool vi非正常退出.swp删除不了的问题
- ExtJs 滚动条问题