DataBinding 的Listview綁定

Databinding的經常使用操做:

以前在網上找了各類Databinding的教程,都比較雜亂,並且時間上也不一樣,都是幾年前的帖子配置方法也有很大出入,下面是本人親測使用的一些案例,用於分享,若有不對,還請指正:

1.使用:

如今的時間是: 2017-2-4 10:35:07android

使用的工具版本分別是:app

AndroidStudio 2.2.3ide

gradle 2.2.3工具

使用DataBinding直接在Module的.gradle中配置以下代碼:佈局

android {
    
    ...
    //一步搞定
    dataBinding{
        enabled = true;
    }

}

2.簡單綁定:

在使用以前須要說明的是佈局文件(layout)跟之前的寫法是不一樣的畢竟要綁定數據嘛:gradle

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="cn.lxw.databinding.User"/>
    </data>

    <LinearLayout
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.firstName}"
            android:textSize="30sp"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.lastName}"
            android:textSize="30sp"/>

    </LinearLayout>
</layout>

1.在原來的根佈局外面要套一層 layout 而且在裏面使用<data></data>來進行變量的聲明:this

這裏咱們聲明瞭一個user變量,名叫"user",他的type指向的就是User這個Bean文件以下:google

public class User {
    private String firstName;
    private String lastName;

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public User(String firstName, String lastName) {

        this.firstName = firstName;
        this.lastName = lastName;
    }
}

你可使用get/set方法,也能夠直接聲明構造方法,靜態變量~!線程

而後在Activity中使用:

@Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         ActivityMainBinding mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
         User user = new User("古", "樹");
         mainActivityBinding.setUser(user);
    }

這裏 setContentView()的老式方式進行了改變使用DataBindingUtil.setContentView()他會返回一個特殊的類這個類的名字是根據你的佈局文件名字來生成的,例如:code

activity_main.xml  對應的就是  ActivityMainBinding;

去掉下劃線,單詞首字母大寫,以"Binding"爲後綴!

這樣對應的控件上面就會顯示對應的數據,這裏就補貼圖了.你們能夠本身嘗試!

3.ListView和Adapter:

3.1 佈局文件:

很簡單就是一個Listview,注意他的變量聲明

<?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>


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

        <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:adapter="@{adapter}"/>

    </LinearLayout>
</layout>

3.2 item的佈局:

也很簡單就是兩個TextView,一樣注意他們的變量聲明

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

    <data>

        <variable
            name="UserBean"
            type="cn.lxw.databinding.User"/>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.3"
            android:text="@{UserBean.firstName}"
            android:textColor="#0094ff"
            android:textSize="26sp"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.7"
            android:text="@{UserBean.lastName??`數據爲空`}"
            android:textColor="#00ff94"
            android:textSize="20sp"/>
    </LinearLayout>

</layout>

3.3 Adapter的定義:

能夠看到這裏徹底不須要使用ViewHolder了.
構造方法中的接受參數分別是:數據類型,listView的佈局ID,以及,item中定義的對象Id.

public class MyAdapter<T> extends BaseAdapter {
    private List<T> data;
    private int itemLayoutId;
    private int variableId;


    public MyAdapter(List<T> data, int itemLayoutId, int variableId) {
        this.data = data;
        this.itemLayoutId = itemLayoutId;
        this.variableId = variableId;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public T getItem(int position) {
        return data.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewDataBinding binding;
        if (convertView == null) {
            binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), itemLayoutId, parent, false);
        } else {
            binding = DataBindingUtil.getBinding(convertView);
        }
        binding.setVariable(variableId, data.get(position));
        return binding.getRoot();
    }
}

3.4 setAdapter

List<User> users = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        User user;
        if (i % 2 == 0) {
            user = new User("L---" + i, null);
        } else {
            user = new User("L---" + i, "xw");
        }
        users.add(user);
    }
    adapter = new MyAdapter<>(users, R.layout.item, BR.UserBean);
    secondBinding.setAdapter(adapter);

這裏作個小彩蛋, 偶數的LastName直接設置爲null,在item的佈局中作了小處理,能夠看上面,他的三元運算是有些區別的. 詳細能夠查看.

另外我是直接調用的secondBinding.setAdapter(adapter); 並無調用secondBinding.lv.setAdapter(adapter)
由於在佈局中聲明瞭下面的變量:

<data>

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

4.注意事項:

在layout中使用的三元運算符 有兩種書寫方式:

android:text="@{UserBean.lastName??`數據爲空`}"
android:text="@{UserBean.lastName==null ? `數據爲空`: UserBean.lastName}"

,而且 若是涉及到字符串中還有字符串應當使用 ` 來區分

5.其特色:

因爲春節期間玩的忘了型,如今想起來幾個優勢:

  1. 一個項目基本一個adapter就能夠搞定列表了,只是item的佈局不一樣而已傳入構造方法就行.

  2. 在子線程中能夠操做佈局,你們能夠本身試試,新開條線程,去修改view.

  3. 不用再去findviewbyid了, 直接使用 生成的類.viewid就行``

目前就是用過這麼多,在羣裏問了些大神,對listview都沒有過多的研究綁定數據.我也是各類google才弄得有些眉目, 若有不對還請指正.但願能幫到你們.

相關文章
相關標籤/搜索