日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Data Binding Library数据绑定框架

發(fā)布時間:2025/4/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Data Binding Library数据绑定框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Data Binding Library是Google在2015年IO大會上發(fā)布的一個用于實(shí)現(xiàn)MVVM設(shè)計(jì)模式的支持庫

環(huán)境配置

在Android Studio 2.0 原生支持Data Binding框架,配置也變得很簡單,只需要在gradle中配置如下腳本即可

android {dataBinding{enabled = true;} }

布局文件

使用Data Binding后,布局文件也跟以前的有所區(qū)別

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"><data><import type="android.view.View"/><variable name="user" type="com.example.User"/></data><LinearLayout android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.lastName}"/></LinearLayout> </layout> 標(biāo)簽說明
layout布局文件的根節(jié)點(diǎn)
data要實(shí)現(xiàn) MVVM 的 ViewModel 就需要把數(shù)據(jù)(Model)與 UI(View) 進(jìn)行綁定,data 節(jié)點(diǎn)的作用就像一個橋梁,搭建了 View 和 Model 之間的通路
variable聲明變量
import導(dǎo)包
@{ }使用定義的變量

 
注意:java.lang.* 包中的類會被自動導(dǎo)入,可以直接使用,例如要定義一個 String 類型的變量:

<variable name="firstName" type="String" />

Includes

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><LinearLayout android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><include layout="@layout/name"bind:user="@{user}"/><include layout="@layout/contact"bind:user="@{user}"/></LinearLayout> </layout>

需要注意的是,Data binding不支持include標(biāo)簽作為merge標(biāo)簽的直接子標(biāo)簽,例如下面的布局是不支持的

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://schemas.android.com/apk/res-auto"><data><variable name="user" type="com.example.User"/></data><merge><include layout="@layout/name"bind:user="@{user}"/><include layout="@layout/contact"bind:user="@{user}"/></merge> </layout>

綁定數(shù)據(jù)

@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);User user = new User("Test", "User");binding.setUser(user); }
  • 系統(tǒng)會幫我們自動生成一個以xml布局文件名字開始,以Binding結(jié)束的類,例如上面的MainActivityBinding.java,另外還會生成一個BR文件,類似于R文件。
  • 除了使用框架自動生成的 MainActivityBinding,我們也可以通過如下方式自定義類名
<data class="com.example.CustomBinding"> </data>

use data binding items inside a ListView adapter

1、BaseAdapter

class CommonAdapter<T> extends BaseAdapter{private List<T> mList;private Context mContext;private int layoutId;private int variableId;public CommonAdapter(List<T> list, Context context, int lauoutId, int variableId) {mList = list;mContext = context;this.layoutId = lauoutId;this.variableId = variableId;}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewDataBinding binding = null;if (convertView == null){binding = DataBindingUtil.inflate(LayoutInflater.from(mContext),layoutId,parent,false);}else {binding = DataBindingUtil.getBinding(convertView);}binding.setVariable(variableId,mList.get(position));return binding.getRoot();}}

2、布局文件
ListView的item布局

<?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="user"type="com.google.demo.model.User"/></data><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageView android:layout_width="wrap_content"android:layout_height="wrap_content"app:imageUrl="@{user.icon}"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.name}"/></LinearLayout> </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"><data><variable name="adapter"type="android.widget.BaseAdapter"/></data><ListView android:layout_width="match_parent"android:layout_height="match_parent"app:adapter="@{adapter}"/><!--因?yàn)長istView有setAdapter()方法,所以這里可以使用app:adapter屬性--> </layout>

3、邏輯代碼

LayoutLvBinding binding = DataBindingUtil.setContentView(this, R.layout.layout_lv);List<User> list = new ArrayList<>();CommonAdapter<User> adapter = new CommonAdapter<>(list,this,R.layout.lv_item, com.google.demo.BR.user);binding.setAdapter(adapter);

Observable Objects

private static class User extends BaseObservable {private String firstName;private String lastName;@Bindablepublic String getFirstName() {return this.firstName;}@Bindablepublic String getLastName() {return this.lastName;}public void setFirstName(String firstName) {this.firstName = firstName;notifyPropertyChanged(BR.firstName);}public void setLastName(String lastName) {this.lastName = lastName;notifyPropertyChanged(BR.lastName);} }
  • BaseObservable:實(shí)現(xiàn)數(shù)據(jù)的更新同步到UI控件上需要實(shí)現(xiàn)該接口
  • @Bindable注解標(biāo)記過 的getter 方法會在 BR 中生成一個 entry
  • notifyPropertyChanged(BR.firstName)通知View更新

ObservableFields

private static class User {public final ObservableField<String> firstName =new ObservableField<>();public final ObservableField<String> lastName =new ObservableField<>();public final ObservableInt age = new ObservableInt(); }

ObservableField, ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, and ObservableParcelable

Observable Collections

ObservableArrayMap

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); user.put("firstName", "Google"); user.put("lastName", "Inc."); user.put("age", 17);

在布局文件中使用

<data><import type="android.databinding.ObservableMap"/><variable name="user" type="ObservableMap&lt;String, Object>"/> </data><TextView android:text='@{user["lastName"]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/> <TextView android:text='@{String.valueOf(1 + (Integer)user["age"])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>

ObservableArrayList

ObservableArrayList<Object> user = new ObservableArrayList<>(); user.add("Google"); user.add("Inc."); user.add(17);

在布局文件中使用

<data><import type="android.databinding.ObservableList"/><import type="com.example.my.app.Fields"/><variable name="user" type="ObservableList&lt;Object>"/> </data><TextView android:text='@{user[Fields.LAST_NAME]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/> <TextView android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>

生成Binding class

所生成的Binding類都繼承自ViewDataBinding

MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater); MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false); MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot); ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId,parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bind(viewRoot, layoutId);

綁定事件

public class MyHandlers {public void onClickFriend(View view) { ... }public void onClickEnemy(View view) { ... } } <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variable name="handlers" type="com.example.Handlers"/><variable name="user" type="com.example.User"/></data><LinearLayout android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.firstName}"android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{user.lastName}"android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/></LinearLayout> </layout>

使用資源數(shù)據(jù)

android:padding="@{large? (int)@dimen/largePadding : (int)@dimen/smallPadding}"

Null Coalescing Operator

android:text="@{user.displayName ?? user.lastName}"

等價于

android:text="@{user.displayName != null ? user.displayName : user.lastName}"

集合的使用

<data><import type="android.util.SparseArray"/><import type="java.util.Map"/><import type="java.util.List"/><variable name="list" type="List&lt;String>"/><variable name="sparse" type="SparseArray&lt;String>"/><variable name="map" type="Map&lt;String, String>"/><variable name="index" type="int"/><variable name="key" type="String"/> </data> … android:text="@{list[index]}" … android:text="@{sparse[index]}" … android:text="@{map[key]}"

Custom Setters

@BindingAdapter({"imageUrl"}) public static void loadImage(ImageView iv,String url){if (url == null){iv.setImageResource(R.mipmap.ic_launcher);}else {Glide.with(iv.getContext()).load(url).into(iv);}}

Converters(轉(zhuǎn)換器)

@BindingConversion public static ColorDrawable convertColorToDrawable(int color) {return new ColorDrawable(color); } <View android:background="@{isError ? @drawable/error : @color/white}"android:layout_width="wrap_content"android:layout_height="wrap_content"/>

DataBindingComponent

所有被注解@BindingAdapter標(biāo)記的方法,如果該方法為非靜態(tài)方法,那么都需要一個Component對象,而所需要的Component對象由DataBindingComponent提供,所以我們需要自定義類實(shí)現(xiàn)DataBindingComponent接口

public class Utils {@BindingAdapter({"imageUrl"})public static void loadImage(ImageView iv,String url){if (url == null){iv.setImageResource(R.mipmap.ic_launcher);}else {Glide.with(iv.getContext()).load(url).into(iv);}} } public class MyComponent implements android.databinding.DataBindingComponent {private Utils mUtils@Overridepublic Utils getUtils() {if (mUtils == null){mUtils = new Utils();}return mUtils;}}

在DataBindingUtil.setContentView()之前設(shè)置Component

DataBindingUtil.setDefaultComponent(new MyComponent());

參考

https://github.com/LyndonChin/MasteringAndroidDataBinding

總結(jié)

以上是生活随笔為你收集整理的Data Binding Library数据绑定框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 三年大全国语中文版免费播放 | 国内自拍青青草 | 中文字幕免费观看 | 岛国伊人 | 91美女网| 浮力影院国产第一页 | 自拍偷拍视频在线 | 国产日产精品一区二区 | 亚洲国产欧美精品 | 中国挤奶哺乳午夜片 | 求一个黄色网址 | 欧美一区二区三区公司 | 国产成人日韩 | 豆豆色成人网 | 国产精品久久麻豆 | 欧美xx孕妇 | 女人叫床很黄很污句子 | 免费在线播放视频 | 亚洲va国产天堂va久久 en | 亚洲xxxx天美 | 高清国产mv在线观看 | 在线你懂得 | 以女性视角写的高h爽文 | 欧美一级片播放 | 国产一区二区三区免费观看 | 淫欲av| 五月婷婷色综合 | 亚洲香蕉中文网 | 国产精品亚洲lv粉色 | 一区二区三区四区国产精品 | 丁香婷婷激情 | 天天爽天天爽天天爽 | 日韩精品免费在线视频 | 狠狠撸在线视频 | 国产高清精品软件丝瓜软件 | 狠狠干2020| 久久久午夜精品 | 天天躁日日躁狠狠躁免费麻豆 | 国产一级aa大片毛片 | 艳母日本动漫在线观看 | 中文字幕免费播放 | 9999久久久久| 日韩区在线观看 | 亚洲欧美日本在线 | 国产伦一区二区 | 精品无码av一区二区三区 | 涩涩成人网 | 国产剧情一区二区 | 免费在线成人 | 国产黄a三级三级三级 | 2019中文字幕在线免费观看 | 午夜爽爽视频 | 在线观看理论片 | 99久久久无码国产精品性 | 黄色观看网站 | 日韩精品中文字幕一区二区三区 | 天天做夜夜做 | 日韩视频在线观看免费 | 国产综合视频一区二区 | 99久久99九九99九九九 | 日日碰狠狠添天天爽 | 久久精品无码一区二区三区 | 国产真实的和子乱拍在线观看 | 日本在线中文 | 奶波霸巨乳一二三区乳 | 正在播放国产精品 | 国产偷人妻精品一区二区在线 | 精品一区二区久久久久久按摩 | 日韩精品自拍 | 欧美日韩三级在线 | av中文在线播放 | 亚洲最大av | 九草在线| 久草综合在线观看 | 超碰91人人 | 欧美久久天堂 | 爱乃なみ加勒比在线播放 | 黑人激情视频 | 久久成人动漫 | 欧美日韩精品在线观看 | 国产乱国产乱300精品 | 欧美亚洲视频一区 | 婷婷一区二区三区 | 女人18毛片水真多18精品 | 久久精品国产av一区二区三区 | 久久精品国产亚洲av蜜臀色欲 | 黄色一大片 | 欧美日韩综合一区二区三区 | 久久久无码精品亚洲无少妇 | 毛片www| 国产日韩欧美一区二区 | 天堂中文字幕在线 | 天天燥日日燥 | 精品国产一区二区三区性色 | 国产精品第七页 | 丰满少妇在线观看资源站 | 加勒比成人在线 | 亚洲午夜激情视频 | 亚洲午夜av|