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布局文件就完成了。
来分析一下:
这样我们的数据绑定等操作就完成了。
看看我们的适配器是如何操作的
/**
* 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;
}
}
这样我们的操作就完成了。来分析一下:
这个就是我们的适配器代码,其他的代码和正常的适配器没有啥区别。
如何使用这个适配器
使用他的话就和我们使用普通的适配器是一样的。看看代码:
@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的坑
- 在使用适配器的时候
BR报错
或者是无法找到引用名称如user。
如何解决:
就是注意我们的实体类的命名,名字的第一个字母需要大写。不然你就会非常的难受,别问我为啥知道。