数据绑定技术DataBinding

数据绑定技术使用一

第一步添加配置

项目下的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}" />
    <!--不用用<或者>运算符,用&lt代替<;用&gt代替>-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.email}"
        android:textColor="@{user.level &lt; 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}" />
    <!--不用用<或者>运算符,用&lt代替<;用&gt代替>-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{user.email}"
        android:textColor="@{user.level &lt; 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"?>
<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&lt;User&gt;==List<User>-->
    <variable
        name="users"
        type="java.util.List&lt;User&gt;" />
</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类继承与BaseObservable

2.getName方法中添加@Bindable注解 @Bindable public String getName() { return name; }

3.setName方法中刷新数据 public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值