安卓日记——再也不用findViewById了(DataBinding快速入门)

来源:互联网 发布:会计网络培训 编辑:程序博客网 时间:2024/06/06 21:37

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是不是好强大呢,果然是谷歌的亲儿子啊!

0 0