DataBinding是谷歌一個數據綁定框架,谷歌出品师抄,必屬佳品
他的主要思想是mvvm,但這里不是重點,重點如何簡單的使用這個好用的框架
1.設置使用dataBindind
要求你的gradule版本>=1.5
這里甚至不用下載包汰具,只要加幾行配置就好了
在app的build.gradule=>android下添加
dataBinding {
enabled = true
}
2.寫主布局
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn"
android:text="button"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rw"></android.support.v7.widget.RecyclerView>
</LinearLayout>
</layout>
就是這么簡單,在外面加一個layout標簽就好了
控件的id也要設好
3.寫主布局的邏輯代碼
public class MainActivity extends AppCompatActivity {
private List<Student> data=new ArrayList<Student>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initVariable();
//binding的名字隨便起,寫完這一行后會提示你導入的
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
LinearLayoutManager manager=new LinearLayoutManager(this);
//binding后加的就是控件的id
binding.rw.setLayoutManager(manager);
binding.rw.setAdapter(new RecAdapter(data,this));
binding.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
}
});
}
private void initVariable() {
for (int i=0;i<10;i++){
Student student=new Student("jack"+i,"GZ"+i);
data.add(student);
}
}
}
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);是重點
binding后加上控件的id然后接下來就和平常的控件用法一樣了
不過RecyclerView比較特別菱魔,接下來詳細介紹一下他的用法
4.寫數據的實體
public class Student {
private String name;
private String addr;
public Student() {
}
public Student(String name, String addr) {
this.name = name;
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return this.addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
5.寫item的布局
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="stu"
type="com.jkgeekjack.usedatabinding.Student" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{stu.name}"
android:layout_alignParentLeft="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{stu.addr}"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</layout>
看到這里會發(fā)現和我們平時用的有很大不同,這就是VM吟孙,這里不深究
首先聲明你要放置的數據類型并起個名字澜倦,類型要加上包名
然后什么地方放這個實體的什么屬性都設置好,到時傳入一個實例就會自動把屬性放到相應的位置
6.寫RecyclerView的Adapter
public class RecAdapter extends RecyclerView.Adapter<RecAdapter.ViewHolder> {
List<Student> data=new ArrayList<Student>();
Context context;
public RecAdapter(List<Student>data,Context context){
this.data=data;
this.context=context;
}
@Override
public RecAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//在Adapter里的用法不同于Activity杰妓,不能用setContenView
ViewDataBinding binding=DataBindingUtil.inflate(LayoutInflater.from(context),R.layout.item_user,parent,false);
//binding.getRoot()就是獲取binding的view
ViewHolder viewHolder=new ViewHolder(binding.getRoot());
//讓viewholder和binding綁定起來
viewHolder.setBinding(binding);
return viewHolder;
}
@Override
public void onBindViewHolder(RecAdapter.ViewHolder holder, final int position) {
//包名+.BR+.name藻治,接下來傳入數據
holder.getBinding().setVariable(com.jkgeekjack.usedatabinding.BR.stu,data.get(position));
//設置item的監(jiān)聽
holder.getBinding().getRoot().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,data.get(position).getAddr(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
ViewDataBinding binding;
public ViewHolder(View itemView) {
super(itemView);
}
public void setBinding(ViewDataBinding binding) {
this.binding = binding;
}
public ViewDataBinding getBinding() {
return binding;
}
}
}
以前的ViewHolder都是裝控件的,現在變成了裝ViewDataBinding的
因為已經設好數據的擺放位置巷挥,就直接用setVariable傳數據進去就好了
這樣基本的方法就搞好了
最后還有個彩蛋
DataBinding還有個強大的地方
可以直接傳入一個實例桩卵,像adapter里那樣,不過在Activity里面會更加簡單倍宾,不用寫name
不過傳入的方法有點不同
主布局改為
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="stu"
type="org.loader.androiddatabinding.Student" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{stu.name}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{stu.addr}"/>
</LinearLayout>
</layout>
然后主布局的邏輯代碼適這樣的
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setStu(new Student("jack", "GZ"));
}
}
setStu是自動生成的雏节,你輸入bingind.set會提示你布局里你個實例的名字以大寫開頭,然后就直接傳入數據就好了
DataBinding是不是好強大呢高职,果然是谷歌的親兒子肮痴А!