如今的時間是: 2017-2-4 10:35:07android
使用的工具版本分別是:app
AndroidStudio 2.2.3ide
gradle 2.2.3工具
使用DataBinding直接在Module的.gradle中配置以下代碼:佈局
android { ... //一步搞定 dataBinding{ enabled = true; } }
在使用以前須要說明的是佈局文件(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方法,也能夠直接聲明構造方法,靜態變量~!線程
@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"爲後綴!
這樣對應的控件上面就會顯示對應的數據,這裏就補貼圖了.你們能夠本身嘗試!
很簡單就是一個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>
也很簡單就是兩個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>
能夠看到這裏徹底不須要使用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(); } }
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>
在layout中使用的三元運算符 有兩種書寫方式:
android:text="@{UserBean.lastName??`數據爲空`}" android:text="@{UserBean.lastName==null ? `數據爲空`: UserBean.lastName}"
,而且 若是涉及到字符串中還有字符串應當使用 ` 來區分
因爲春節期間玩的忘了型,如今想起來幾個優勢:
一個項目基本一個adapter就能夠搞定列表了,只是item的佈局不一樣而已傳入構造方法就行.
在子線程中能夠操做佈局,你們能夠本身試試,新開條線程,去修改view.
不用再去findviewbyid了, 直接使用 生成的類.viewid就行``
目前就是用過這麼多,在羣裏問了些大神,對listview都沒有過多的研究綁定數據.我也是各類google才弄得有些眉目, 若有不對還請指正.但願能幫到你們.