数据绑定技术DataBinding
2018-01-09 13:37
465 查看
数据绑定技术使用一
第一步添加配置
项目下的build.gradle下的android中defaultConfig下方添加代码:dataBinding{ enabled true }
第二步添加数据常量并设置set和get方法,因为偷懒就不写了
public class User { private String name; private String nickName; private String email; private boolean vip; /** * 点击用户名 */ public void clickName(View view){ Toast.makeText(view.getContext(),"点击了用户名",Toast.LENGTH_LONG).show(); } /** * 长按昵称 */ public boolean longClickName(View view){ Toast.makeText(view.getContext(),"长按了昵称",Toast.LENGTH_LONG).show(); return true; } }
第三步布局:type是自己定义常量的位置
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.hbwj.myapplication.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <!--是否是会员,是文字颜色为红色,不是文字颜色为黑色--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{user.clickName }" android:text="@{user.nickName+'('+user.name+')'}" android:textColor="@{user.vip?0xffff0000:0xff000000}" /> <!--user.nickName??user.name==user.nickName==null?user.name:user.nickName--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onLongClick="@{user.longClickName}" android:text="@{user.nickName??user.name}" /> <!--不用用<或者>运算符,用<代替<;用>代替>--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.email}" android:textColor="@{user.level < 3 ?0xffff0000:0xff000000}" /> </LinearLayout> </layout>
第四步:activity下的使用
//setContentView(R.layout.activity_main); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user=new User(); user.setName("用户名"); user.setNickName("昵称"); user.setEmail("1024@qq.com"); user.setLevel(5); user.setVip(true); binding.setUser(user);
数据绑定技术二
第一步:将之前的activitymain布局复制到userlayout中并且修改代码
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.hbwj.myapplication.User" /> </data> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <!--是否是会员,是文字颜色为红色,不是文字颜色为黑色--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{user.clickName }" android:text="@{user.nickName+'('+user.name+')'}" android:textColor="@{user.vip?0xffff0000:0xff000000}" /> <!--user.nickName??user.name==user.nickName==null?user.name:user.nickName--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onLongClick="@{user.longClickName}" android:text="@{user.nickName??user.name}" /> <!--不用用<或者>运算符,用<代替<;用>代替>--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.email}" android:textColor="@{user.level < 3 ?0xffff0000:0xff000000}" /> </LinearLayout> </layout>
修改activity_main:
<?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="user" type="com.hbwj.myapplication.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal"> <include layout="@layout/user_layout" app:user="@{user}"/> <include layout="@layout/user_layout" app:user="@{user}"/> </LinearLayout> </layout>
第二步:MainActivity中新增一个User对象
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); users = new ArrayList<>(); User user = new User(); user.setName("用户名"); user.setNickName("昵称"); user.setEmail("1024@qq.com"); user.setLevel(5); user.setVip(true); User user1 = new User(); user1.setName("用户名2"); user1.setNickName("昵称2"); user1.setEmail("1028@qq.com"); user1.setLevel(2); user1.setVip(false); users.add(user); users.add(user1); binding.setUsers(users);
第三步:修改主布局
<?xml version="1.0" encoding="utf-8"?> & f31f lt;layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <import type="com.hbwj.myapplication.User" /> <!--java.util.List<User>==List<User>--> <variable name="users" type="java.util.List<User>" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="horizontal"> <include layout="@layout/user_layout" app:user="@{users[0]}" /> <include layout="@layout/user_layout" app:user="@{users[1]}" /> </LinearLayout> </layout>
第四步:修改User中的点击事件
/** * 点击用户名 */ public void clickName(View view){ Toast.makeText(view.getContext(),"点击了:"+name,Toast.LENGTH_LONG).show(); } /** * 长按昵称 */ public boolean longClickName(View view){ Toast.makeText(view.getContext(),"长按了:"+nickName,Toast.LENGTH_LONG).show(); return true; }
数据绑定技术加载图片
首先布局user_layout中添加ImageView控件
<ImageView android:layout_width="100dp" android:layout_height="100dp" app:imageUrl="@{user.icon}"/>
自定义一个工具类加载图片
/** * 加载图片 */ @BindingAdapter({"imageUrl"})//随便起,但要保证布局中设置的和它一样 public static void loadImageView(ImageView imageView,String url){ if(url==null){ imageView.setImageResource(R.drawable.ic_launcher); }else { Glide.with(imageView.getContext()).load(url).into(imageView); } }
设置图片的url,图片自己去网上找,风骚的,性感的,可爱的你想咋整你随意
user.setIcon("http://p0.so.qhimgs1.com/bdr/_240_/t019aa0ed00b08bc6ec.jpg");
数据绑定技术之listview的使用
首先第一步新建一个通用adapter
public class CommonAdapter<T> extends BaseAdapter { private Context context; private List<T> list; private int layoutId;//布局的id private int veriableId;//databinding的变量id public CommonAdapter(Context context, List<T> list, int layoutId, int veriableId) { this.context = context; this.list = list; this.layoutId = layoutId; this.veriableId = veriableId; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.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(context), layoutId, parent, false); } else { binding = DataBindingUtil.getBinding(convertView); } binding.setVariable(veriableId, list.get(position)); return binding.getRoot(); } }
第二步:主布局
<?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:gravity="center" android:orientation="horizontal"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" app:adapter="@{adapter}"> </ListView> </LinearLayout> </layout>
第三步:每个item的布局,本人比较懒,所以还是用之前的User:
<?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="user" type="com.hbwj.myapplication.User" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:layout_width="100dp" android:layout_height="100dp" app:imageUrl="@{user.icon}" /> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="100dp" android:text="@{user.name}" /> </LinearLayout> </layout>
最后一步就是使用了
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); users = new ArrayList<>(); for (int i = 0; i < 100; i++) { User user = new User(); user.setIcon("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2367757340,3418517196&fm=27&gp=0.jpg"); user.setName("user" + i); users.add(user); } //databinding会自动生成一个BR CommonAdapter<User> adapter = new CommonAdapter<>(MainActivity.this, users, R.layout.item, BR.user); binding.setAdapter(adapter);
图片你自己可以上网搜,一大片,什么类型的都有,绝对足够符合你的口味。
给listview添加点击事件并且刷新数据
首先在User类中添加点击事件
public void onClick(View view) { setName(getName() + "(已点击)"); }
item的布局中添加点击事件,图片、文字或者两者添加以下代码:
android:onClick="@{user.onClick}"
立即刷新数据
1.让user类继承与BaseObservable2.getName方法中添加@Bindable注解 @Bindable public String getName() { return name; }
3.setName方法中刷新数据 public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }
相关文章推荐
- Android DataBinding数据绑定技术在传统ListView中的使用简例
- Android DataBinding数据绑定技术在传统ListView中的使用简例
- Android官方数据绑定框架DataBinding
- Android官方数据绑定框架DataBinding(一)
- Android DataBinding(数据绑定)详解(一)
- WPF数据绑定(2 绑定列表数据Binding to List Data)
- Data Binding Library(数据绑定库)--来自android官网的翻译
- Android官方数据绑定框架DataBinding(三)
- Control.DataBinding数据绑定细解
- Android官方DataBinding(九):反向绑定,View变化结果回写进数据模型中
- android数据绑定之Data Binding
- 译文:Silverlight 3.0 新功能之七 : XAML元素的数据绑定(XAML Element Databinding)
- jface databinding:使用CheckboxTableViewer实现表中(Set)对象与CheckTable中选中条目数据绑定
- Android官方数据绑定框架DataBinding
- jface databinding:label provider 实现多列表格(Table)数据绑定的两个途径
- Android 6.0 数据绑定之DataBinding(一)
- Android官方DataBinding(九):反向绑定,View变化结果回写进数据模型中
- Android官方数据绑定框架DataBinding
- android数据绑定框架DataBinding使用
- Android官方数据绑定框架DataBinding(一)