DataBinding 案例使用demo
使用一个全选,单选,反选,案例来展示databinding的强大
–databinding的基本使用就不说了。通过案例直接来说效果,更加的明朗。先看下效果图;
—头部
头部使用include来显示:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/tools">
<data>
<variable
name="layoutId"
type="java.lang.Integer" />
<variable
name="common"
type="com.geek.mvvmdemo.vm.CommonVm" />
<variable
name="user"
type="com.geek.mvvmdemo.vm.UserVm"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/include_title"
bind:common="@{common}"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
bind:layoutId="@{layoutId}"
bind:listData="@{user.adapterModule}" />
</LinearLayout>
</layout>
这里需要注意绑定include标签中common必须一致.
内容的显示,这里自定义了一个万能的recyclerview,通过一个BaseRecycleViewAdapter来实现所以的adapter的通用。recyclerview中的layoutID是每个item的布局
@BindingAdapter({"layoutId"})
public static void bindRecycleViewLayoutId(RecyclerView recyclerView, int layoutId) {
BaseRecycleViewAdapter baseRecycleViewAdapter = new BaseRecycleViewAdapter(layoutId);
recyclerView.setAdapter(baseRecycleViewAdapter);
}
listData是绑定适配器
@BindingAdapter({"listData"})
public static <T> void bindRecycleViewAdapterModule(RecyclerView recyclerView, AdapterModule<T> adapterModule) {
BaseRecycleViewAdapter<T> adapter;
if (recyclerView.getAdapter() != null) {
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
adapter = (BaseRecycleViewAdapter<T>) recyclerView.getAdapter();
adapter.setAdapterModule(adapterModule);
} else {
return;
}
}
这里可以复写listdata来实现不用的布局格式
item布局中主要实现每个数据展示
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="position"
type="Integer" />
<variable
name="user"
type="com.geek.mvvmdemo.model.UserModel" />
<variable
name="item"
type="com.geek.mvvmdemo.vm.RecyclerListener" />
<import type="android.view.View" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dp">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:text="@{user.userName}"
android:textColor="@{position%2==0 ? @color/red : @color/lu}"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/name"
android:text="@{user.userAge}"
android:textSize="12sp"
android:visibility="@{position==item.adapterModule.list.size()-1?View.GONE:View.VISIBLE}" />
<LinearLayout
android:layout_width="80dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:gravity="center_vertical|right"
android:onClick="@{()->item.onSelect(position)}">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginRight="20dp"
android:onClick="@{()->item.onSelect(position)}"
bind:image="@{user.select}" />
</LinearLayout>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#cccccc" />
</LinearLayout>
</layout>
其中RecyclerListener是每个item的点击事件的控制台。onSelect()来实现每个点击事件的实现
public class RecyclerListener implements View.OnClickListener {
private Context mContext;
private AdapterModule<UserModel> adapterModule;
private CommonVm commonVm;
public void onSelect(int position) {
UserModel model = adapterModule.list.get(position);
if (model.getSelect().equals("0")) {
model.setSelect("1");
commonVm.setIsSelect("1");
} else {
model.setSelect("0");
int sum = 0;
for (UserModel m : adapterModule.list) {
if (m.getSelect().equals("0")) {
sum += 1;
}
}
if (sum == adapterModule.list.size()) {
commonVm.setIsSelect("0");
}
}
}
@Override
public void onClick(View v) {
}
public AdapterModule<UserModel> getAdapterModule() {
return adapterModule;
}
public void setAdapterModule(AdapterModule<UserModel> adapterModule) {
this.adapterModule = adapterModule;
}
public CommonVm getCommonVm() {
return commonVm;
}
public void setCommonVm(CommonVm commonVm) {
this.commonVm = commonVm;
}
public RecyclerListener(Context context) {
this.mContext = context;
}
}
这个类必须实现View.OnClickListener点击事件才能生效,这与BaseRecycleViewAdapter中绑定这个事件是一一对应的。
public void onBindListeners() {
if (listeners != null && listeners.size() > 0) {
for (int i = 0; i < listeners.size(); i++) {
binding.setVariable(listeners.keyAt(i), listeners.get(listeners.keyAt(i)));
}
}
}
在activity中来绑定数据,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//数据
ArrayList<UserModel> list = new ArrayList<>();
for (int i=0;i<6;i++){
UserModel model = new UserModel();
model.setSelect("1");
model.setUserName("BINDING:"+i);
model.setUserAge(String.valueOf(20+i));
model.setUserSex("男");
list.add(model);
}
//include数据
CommonVm vm = new CommonVm(this,list);
vm.setIsSelect("1");//1未选中 0 选中
vm.setTitle("首页");
//item点击事件
SparseArray<View.OnClickListener> listener = new SparseArray<>();
RecyclerListener l = new RecyclerListener(this);
listener.put(BR.item,l);
l.setCommonVm(vm);
AdapterModule<UserModel> userModel = new AdapterModule<>(list, BR.user,BR.position);
l.setAdapterModule(userModel);
//绑定item点击事件
userModel.setListeners(listener);
UserVm userVm = new UserVm(this,userModel);
mBinding.setLayoutId(R.layout.recylcer_view_item);
mBinding.setUser(userVm);
mBinding.setCommon(vm);
}