Android dataBinding 之 配合使用BaseAdapter适配器

Overview

数据绑定库与 Android Gradle 插件捆绑在一起。您无需声明对此库的依赖项,但必须启用它。
启用的方法为:

在我们的app/build.gradle下添加如下代码:

android{
    dataBinding{
        enabled=true
    }
}

如何在布局文件中使用

先是看看我们的代码:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="com.example.android_databingding_learn.UserInfo" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#E3F2FD"
        android:orientation="vertical"
        android:paddingStart="3dp">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:text="@{user.id}"
            android:textColor="@android:color/black"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/itemLayout_txtName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:text="@{user.name}"
            android:textColor="@android:color/black"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:text="@{user.gender}"
            android:textColor="@android:color/black"
            android:textSize="16sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="3dp"
            android:text="@{user.age}"
            android:textColor="@android:color/black"
            android:textSize="16sp"
            android:textStyle="bold" />
    </LinearLayout>
</layout>

这样我们的layout布局文件就完成了。
来分析一下:
Android DataBinding layout界面解析图片
这样我们的数据绑定等操作就完成了。

看看我们的适配器是如何操作的

/**
 * Date 5/3/2020
 * Author CaoJiaHao
 * Description DataBinding X BaseAdapter
 **/
public class MainAdapter extends BaseAdapter {
    private Context mContext;
    private List<UserInfo> usersList;

    public MainAdapter(Context mContext, List<UserInfo> usersList) {
        this.mContext = mContext;
        this.usersList = usersList;
    }

    @Override
    public int getCount() {
        return usersList.size();
    }

    @Override
    public Object getItem(int i) {
        return usersList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        ItmeLayoutBinding binding;
        if (view == null) {
            binding = DataBindingUtil.inflate(LayoutInflater.from(this.mContext), R.layout.itme_layout, viewGroup, false);
            view = binding.getRoot();
            view.setTag(binding);

            //绑定我们的点击事件
            view.findViewById(R.id.itemLayout_txtName).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, usersList.get(i).getName(), Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            binding = (ItmeLayoutBinding) view.getTag();
        }
        binding.setVariable(BR.user, usersList.get(i));
        return view;
    }
}

这样我们的操作就完成了。来分析一下:
Android Databinding 适配器解析一
Android Databinding 适配器解析二
这个就是我们的适配器代码,其他的代码和正常的适配器没有啥区别。

如何使用这个适配器

使用他的话就和我们使用普通的适配器是一样的。看看代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    List<UserInfo> usersList = new ArrayList<>();
    int a = 30;
    for (int i = 0; i < a; i++) {
        UserInfo userInfo = new UserInfo(String.valueOf(i), "GreatCoder", "Male", "17");
        usersList.add(userInfo);
    }
    ListView listview = this.findViewById(R.id.main_ListVew);
    listview.setAdapter(new MainAdapter(this, usersList));
}

就是这么的简单。看看我们的运行效果图:

可以看到前面还有相关标识。

如何在绑定值中进行字符串拼接

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="3dp"
    android:text='@{@string/age+user.age}'
    android:textColor="@android:color/black"
    android:textSize="16sp"
    android:textStyle="bold" />

这个就是我所使用的方法。是引用string中的值。但是需要注意的是!
不推荐!!这样去写:

android:text='@{"年龄: "+user.age}'

为啥不推荐怎么写?以为在DataBinding中如果出现错误,软件不会指向错误的地方。后期排查工作量非常的大。

DataBinding的坑

  1. 在使用适配器的时候BR报错或者是无法找到引用名称如user。
    如何解决:
    就是注意我们的实体类的命名,名字的第一个字母需要大写。不然你就会非常的难受,别问我为啥知道。
原文地址:https://www.cnblogs.com/cao-1/p/12657802.html