Overview
绑定适配器负责发出相应的框架调用来设置值。例如,设置属性值就像调用 setText() 方法一样。再比如,设置事件监听器就像调用
setOnClickListener() 方法。数据绑定库允许您通过使用适配器指定为设置值而调用的方法、提供您自己的绑定逻辑,以及指定返回对象的类型。
看看如何实现的吧
首先我们看一下我们的item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.databinding_demo.UserInfoEntity" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{user.name+user.gender}"
android:textColor="@android:color/holo_blue_light" />
</LinearLayout>
</layout>
我们先是创建了一个UserInfoEntity的实体类。里面就两个属性,这里就不贴代码了。
然后我们可以看到我们这里使用的ListView
控件中的子布局。他绑定的就是我们的UserInfoEntity
然后里面的TextView
绑定的是我们的name 和 gender.
这里如果你有数据绑定的基础做起来还是非常的简单的。
然后我们看一下如何根据数据绑定创建一个BaseAdapter的适配器。
按照惯例先看看代码:
public class ItemAdapter extends BaseAdapter {
List<UserInfoEntity> usersItem = new ArrayList<>();
private Context context;
public ItemAdapter(List<UserInfoEntity> usersItem, Context context) {
this.usersItem = usersItem;
this.context = context;
}
@Override
public int getCount() {
return this.usersItem.size();
}
@Override
public Object getItem(int i) {
return this.usersItem.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ItemBinding dataBinding;
if (view == null) {
dataBinding = DataBindingUtil.inflate(LayoutInflater.from(this.context), R.layout.item, viewGroup, false);
view = dataBinding.getRoot();
view.setTag(dataBinding);
} else {
dataBinding = (ItemBinding) view.getTag();
}
dataBinding.setVariable(BR.user,usersItem.get(i));
return view;
}
}
这里可以看到就是getView
方法和普通的适配器不一样。
好~接着看一下如何使用吧:
首先我们实例化一个Binding。
然后将我们的Binding绑定到我们的View中去。但是在这个之前我们需要判断一个view是否为空 。
然后通过绑定Tag来实现。
最后我们需要通过设置dataBinding的变量来完成数据绑定。
现在我们的适配器完成了。然后看看如何使用我们的适配器吧。
显示看一下界面代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/main_ListView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
然后是我们的活动逻辑代码:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
List<UserInfoEntity> usersList = new ArrayList<>();
int a = 30;
for (int i = 0; i < a; i++) {
usersList.add(new UserInfoEntity("Jia Hao", "Male"));
}
binding.mainListView.setAdapter(new ItemAdapter(usersList, MainActivity.this));
}
}
首先需要实例化我们的活动数据绑定的dataBinding
然后初始化数据,最后使用binding进行数据绑定,在这个期间不需要使用任何的控件初始换,可以说是非常的方便。
这样我们的适配器就调用成功了。非常简单。