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>
看到这里会发现和我们平时用的有很大不同,这就是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的监听
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是不是好强大呢,果然是谷歌的亲儿子啊!
网友评论
holder.getBinding().setVariable(com.jkgeekjack.usedatabinding.BR.stu,data.get(position));
这行代码是什么意思?为什么要加一个BR?