Android數(shù)據(jù)綁定框架DataBinding

今天介紹一個新框架DataBinding我擂,之前我們需要在每個activity findViewById拂檩,不僅麻煩,還增加代碼的耦合性问顷, 而DataBinding省時省力,提高解析XML的速度等等

寫篇文章提提神,不用午睡了.gif

那很多人包括我在內(nèi)現(xiàn)在用著ButterKnife 或者注解框架 xutils等禀梳,其實我個人認為ButterKnife 這個懶人庫還是很不錯的 ,但是與DataBinding想比還是不好用杜窄,那其他的第三方框架我認為 如果單單只是用它的注解 確實沒什么必要 現(xiàn)在我們開始普及一下他的用法 :

  • 環(huán)境搭建 這是谷歌去年大會上新推出來的 所以你的api 不能太低哦
android {
    ....
    dataBinding {
        enabled = true
    }
}

先說一個基礎(chǔ)的的對象賦值

  • 我還是喜歡在activity 說起,以下就是activity的寫法 不用像之前的setContentView
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.item.main);
        User user1 = new User("sirai", "23");
        binding.setUser(user1);
  • 布局文件 item.main主要的不同 還是展示在layout 布局文件,here沒有給控件定義id算途,而是用了@{ }的方法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="user"
            type="sale.xz.org.databind.User" />
    </data>

    <LinearLayout
        android:layout_width="wrap_content" android:layout_height="40dp"
        android:gravity="center" android:orientation="horizontal" >

        <!--@{user.clickName} 點擊方法-->
        <TextView
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="@{user.name}"  android:layout_marginLeft="20dp"
            android:onClick="@{user.clickName}" />

        <!--三元表達式 這句話等于  user.age == null ? user.age : user.name-->
        <TextView
            android:layout_width="wrap_content" android:layout_height="wrap_content"
            android:text="@{user.age??user.name}" android:layout_marginLeft="20dp" />

    </LinearLayout>
</layout>
  • 當(dāng)然了我們要有一個實體類塞耕,隨便寫了一個簡單的
public class User {
    private String name;
    private String age;

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public String getAge() {
        return this.age;
    }

}

接下來 我們是list 賦值各個不同的layout 頁面,and 賦值adapter

  • activity
  ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    
        User user1 = new User("sirais", "25");
        User user2 = new User("sirai", "23");
        List<User> list1 = new ArrayList<User>();
        list1.add(user2);
        list1.add(user1);
        binding.setUsers(list1);

//adapter listview 賦值
      List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User("sirai"+i+"", "23");
            list.add(user);
        }
        CommonAdapter<User> adapter = new CommonAdapter<>(this, list, R.layout.item_main, sale.xz.org.databind.BR.user);
        binding.setAdapter(adapter);

  • 布局文件 activity_main 其中有兩個include 不及 需要提示注意的是app xml命名空間
<layout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>

        <import type="java.util.ArrayList" />
        <variable
            name="users"
            type="java.util.List<User>"/>

        <variable
            name="adapter"
            type="android.widget.BaseAdapter"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <include
            layout="@layout/item_main"
            app:user="@{ users[0] }"/>

        <include
            layout="@layout/item_main"
            app:user="@{ users[1] }"/>


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

            <!--所有的set方法都可以用app-->
            <ListView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:adapter="@{ adapter }"/>

        </LinearLayout>
    </LinearLayout>
</layout>
  • 嗯嗯 這里就說到了 我們的adapter 這里用了BR文件,BR文件和R文件都是系統(tǒng)會自動生成的嘴瓤,只是R文件用于資源的id
public class CommonAdapter<T> extends BaseAdapter {
    private Context context;//上下文環(huán)境
    private List<T> list;//通用的扫外,不知道數(shù)據(jù)
    private int layoutId;//通用的,不知道布局
    private int variableId;//變量的id

    /**
     * 構(gòu)造方法
     */
    public CommonAdapter(Context context, List<T> list, int layoutId, int variableId) {
        this.context = context;
        this.list = list;
        this.layoutId = layoutId;
        this.variableId = variableId;
    }

    @Override
    public int getCount() {
        if (list != null)
            return list.size();
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewDataBinding binding = null;
        if (convertView == null) {
            binding = DataBindingUtil.inflate(LayoutInflater.from(context), layoutId, parent, false);
        } else {
            binding = DataBindingUtil.getBinding(convertView);
        }
        binding.setVariable(variableId, list.get(position));
        return binding.getRoot();
    }
}
  • 最后再說明一下實際運用中肯定也會有很多的點擊事件纱注,那么如何實現(xiàn)點擊事件的呢畏浆?怎么刷新變量呢胆胰?

    • 這就是我們?yōu)槭裁丛赨ser實體類User中添加了clickName方法的原因

    • 刷新變量 這里用到一個觀察者模式狞贱,只需要把User繼承BaseObservable類,并且在要更改的屬性上加一個@Bindble蜀涨,再在setName方法中加入notifyPropertyChanged這樣一句話則可瞎嬉。

public class User extends BaseObservable {
    private String name;
    private String age;

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public void setAge(String age) {
        this.age = age;
    }
    
    public String getAge() {
        return this.age;
    }



    public void clickName(View view){
        setName(getName() + "( 已點擊 )");
    }

    @Bindable
    public String getName() {
        return name;

    }

    public void setName(String name) {
        this.name = name;
        //刷新變量(變量id)
        notifyPropertyChanged(sale.xz.org.databind.BR.name);
    }


}
賦值adapter效果圖.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厚柳,隨后出現(xiàn)的幾起案子氧枣,更是在濱河造成了極大的恐慌,老刑警劉巖别垮,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件便监,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機烧董,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門毁靶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逊移,你說我怎么就攤上這事预吆。” “怎么了胳泉?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵拐叉,是天一觀的道長。 經(jīng)常有香客問我扇商,道長凤瘦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任案铺,我火速辦了婚禮廷粒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘红且。我一直安慰自己坝茎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布暇番。 她就那樣靜靜地躺著嗤放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁酬。 梳的紋絲不亂的頭發(fā)上次酌,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音舆乔,去河邊找鬼岳服。 笑死,一個胖子當(dāng)著我的面吹牛希俩,可吹牛的內(nèi)容都是我干的吊宋。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼颜武,長吁一口氣:“原來是場噩夢啊……” “哼璃搜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳞上,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤这吻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篙议,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唾糯,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了移怯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拒名。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芋酌,靈堂內(nèi)的尸體忽然破棺而出增显,到底是詐尸還是另有隱情,我是刑警寧澤脐帝,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布同云,位于F島的核電站,受9級特大地震影響堵腹,放射性物質(zhì)發(fā)生泄漏炸站。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一疚顷、第九天 我趴在偏房一處隱蔽的房頂上張望旱易。 院中可真熱鬧,春花似錦腿堤、人聲如沸阀坏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忌堂。三九已至,卻和暖如春酗洒,著一層夾襖步出監(jiān)牢的瞬間士修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工樱衷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棋嘲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓矩桂,卻偏偏與公主長得像沸移,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耍鬓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容