欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据绑定技术DataBinding

程序员文章站 2022-06-08 16:29:06
...

数据绑定技术使用一

第一步添加配置

项目下的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("aaa@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("aaa@qq.com");
    user.setLevel(5);
    user.setVip(true);
    User user1 = new User();
    user1.setName("用户名2");
    user1.setNickName("昵称2");
    user1.setEmail("aaa@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;
}

数据绑定技术DataBinding数据绑定技术DataBinding

数据绑定技术加载图片

首先布局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");

数据绑定技术DataBinding

数据绑定技术之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); }

数据绑定技术DataBinding