DataBinding 案例使用demo

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);
    }

整个案例demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值