美文网首页Android RoadandroidAndroid知识
安卓日记——再也不用findViewById了(DataBind

安卓日记——再也不用findViewById了(DataBind

作者: 饥渴计科极客杰铿 | 来源:发表于2016-07-02 20:35 被阅读825次

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

    相关文章

      网友评论

      • 梦里醉://包名+.BR+.name,接下来传入数据
        holder.getBinding().setVariable(com.jkgeekjack.usedatabinding.BR.stu,data.get(position));

        这行代码是什么意思?为什么要加一个BR?
        饥渴计科极客杰铿:@梦里醉 表示绑定这个实例,BR应该是 real instance(实例)的缩写,就是说要将data中的第n个元素给在layout中声明的stu。这个和最后彩蛋那里有异曲同工之妙,只不过在activity里就直接可以setStu(get(position))就绑定实例了
      • bba41115bf3e:如果我没记错这框架去年都有吧?小编
        饥渴计科极客杰铿:@小志嘛i 没错
      • longmingren123: 很不错的啊,呵呵
      • 乆丩乣:大赞

      本文标题:安卓日记——再也不用findViewById了(DataBind

      本文链接:https://www.haomeiwen.com/subject/ojbqjttx.html