android:DataBinding使用小结(三)

DataBinding在RecycleView中的使用

  • 构建数据类Student
package tsou.cn.databinding.bean;

/**
 * Created by Administrator on 2018/5/31 0031.
 */

public class Student {
    private String name;
    private int age;
    public Student(String name, int age)
    {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 封装通用BaseBindingAdapter
package tsou.cn.databinding.adapter;

import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ObservableArrayList;
import android.databinding.ViewDataBinding;
import android.support.annotation.LayoutRes;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import tsou.cn.databinding.viewholder.BaseBindingViewHolder;

public abstract class BaseBindingAdapter<M, B extends ViewDataBinding> extends RecyclerView.Adapter {
    protected Context context;
    protected ObservableArrayList<M> items;
    protected ListChangedCallback itemsChangeCallback;

    public BaseBindingAdapter(Context context) {
        this.context = context;
        this.items = new ObservableArrayList<>();
        this.itemsChangeCallback = new ListChangedCallback();
    }

    public ObservableArrayList<M> getItems() {
        return items;
    }

    @Override
    public int getItemCount() {
        return this.items.size();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        B binding = DataBindingUtil.inflate(LayoutInflater.from(this.context), this.getLayoutResId(viewType), parent, false);
        return new BaseBindingViewHolder(binding.getRoot());
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        B binding = DataBindingUtil.getBinding(holder.itemView);
        this.onBindItem(binding, this.items.get(position));
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        this.items.addOnListChangedCallback(itemsChangeCallback);
    }

    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
        this.items.removeOnListChangedCallback(itemsChangeCallback);
    }

    //region 处理数据集变化
    protected void onChanged(ObservableArrayList<M> newItems) {
        resetItems(newItems);
        notifyDataSetChanged();
    }

    protected void onItemRangeChanged(ObservableArrayList<M> newItems, int positionStart, int itemCount) {
        resetItems(newItems);
        notifyItemRangeChanged(positionStart, itemCount);
    }

    protected void onItemRangeInserted(ObservableArrayList<M> newItems, int positionStart, int itemCount) {
        resetItems(newItems);
        notifyItemRangeInserted(positionStart, itemCount);
    }

    protected void onItemRangeMoved(ObservableArrayList<M> newItems) {
        resetItems(newItems);
        notifyDataSetChanged();
    }

    protected void onItemRangeRemoved(ObservableArrayList<M> newItems, int positionStart, int itemCount) {
        resetItems(newItems);
        notifyItemRangeRemoved(positionStart, itemCount);
    }

    protected void resetItems(ObservableArrayList<M> newItems) {
        this.items = newItems;
    }
    //endregion

    protected abstract @LayoutRes
    int getLayoutResId(int viewType);

    protected abstract void onBindItem(B binding, M item);

    class ListChangedCallback extends ObservableArrayList.OnListChangedCallback<ObservableArrayList<M>> {
        @Override
        public void onChanged(ObservableArrayList<M> newItems) {
            BaseBindingAdapter.this.onChanged(newItems);
        }

        @Override
        public void onItemRangeChanged(ObservableArrayList<M> newItems, int i, int i1) {
            BaseBindingAdapter.this.onItemRangeChanged(newItems, i, i1);
        }

        @Override
        public void onItemRangeInserted(ObservableArrayList<M> newItems, int i, int i1) {
            BaseBindingAdapter.this.onItemRangeInserted(newItems, i, i1);
        }

        @Override
        public void onItemRangeMoved(ObservableArrayList<M> newItems, int i, int i1, int i2) {
            BaseBindingAdapter.this.onItemRangeMoved(newItems);
        }

        @Override
        public void onItemRangeRemoved(ObservableArrayList<M> sender, int positionStart, int itemCount) {
            BaseBindingAdapter.this.onItemRangeRemoved(sender, positionStart, itemCount);
        }
    }
}
  • BaseBindingViewHolder
package tsou.cn.databinding.viewholder;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by Administrator on 2018/5/31 0031.
 */

public class BaseBindingViewHolder extends RecyclerView.ViewHolder {
    public BaseBindingViewHolder(View itemView) {
        super(itemView);
    }
}
  • 创建StudentAdapter
package tsou.cn.databinding.adapter;

import android.content.Context;

import tsou.cn.databinding.R;
import tsou.cn.databinding.bean.Student;
import tsou.cn.databinding.databinding.ItemStudentBinding;

/**
 * Created by Administrator on 2018/5/31 0031.
 */

public class StudentAdapter extends BaseBindingAdapter<Student,ItemStudentBinding> {



    public StudentAdapter(Context context) {
        super(context);
    }
    @Override
    protected int getLayoutResId(int viewType) {
        return R.layout.item_student;
    }

    @Override
    protected void onBindItem(ItemStudentBinding binding, Student item) {
        binding.setModel(item);
        binding.executePendingBindings();
    }
}
  • 列表布局item_student
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="tsou.cn.databinding.bean.Student" />
        <variable
            name="model"
            type="Student" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginBottom="10dp"
        android:background="@android:color/darker_gray"
        android:gravity="center_vertical"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{model.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(model.age)}" />
    </LinearLayout>
</layout>
  • 创建主布局activity_recycler_view
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <!--
              事件绑定
              name:类名
              type:表示包名
            -->
        <variable
            name="viewModel"
            type="tsou.cn.databinding.viewmodel.RecyclerViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="tsou.cn.databinding.RecyclerViewActivity">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <Button
            android:id="@+id/add_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:onClick="@{viewModel::addData}"
            android:text="添加" />

        <Button
            android:id="@+id/delete_data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:onClick="@{viewModel::deleteData}"
            android:text="删除" />
    </RelativeLayout>
</layout>
  • Activity调用
package tsou.cn.databinding;

import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;

import java.util.ArrayList;

import tsou.cn.databinding.adapter.StudentAdapter;
import tsou.cn.databinding.bean.Student;
import tsou.cn.databinding.databinding.ActivityRecyclerViewBinding;
import tsou.cn.databinding.viewmodel.RecyclerViewModel;

public class RecyclerViewActivity extends AppCompatActivity {
    private ActivityRecyclerViewBinding binding;
    private StudentAdapter adapter;
    private RecyclerViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_recycler_view);
        binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new StudentAdapter(this);
        binding.recyclerView.setAdapter(adapter);

        initData();
//        adapter.getItems().add(new Student("张三", 18));
//        adapter.getItems().add(new Student("李四", 28));
//        adapter.getItems().add(new Student("王五", 38));

        viewModel = new RecyclerViewModel(this, binding, adapter);
        //使用对象
        binding.setViewModel(viewModel);

    }

    private void initData() {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三", 18));
        students.add(new Student("李四", 28));
        students.add(new Student("王五", 38));
        adapter.getItems().addAll(students);
    }

}
  • ViewModel处理逻辑
package tsou.cn.databinding.viewmodel;

import android.content.Context;
import android.view.View;

import java.util.ArrayList;

import tsou.cn.databinding.adapter.StudentAdapter;
import tsou.cn.databinding.bean.Student;
import tsou.cn.databinding.databinding.ActivityRecyclerViewBinding;

/**
 * Created by Administrator on 2018/5/31 0031.
 */

public class RecyclerViewModel {
    private Context mContext;
    private ActivityRecyclerViewBinding mBinding;
    private StudentAdapter mAdapter;

    public RecyclerViewModel(Context context,
                             ActivityRecyclerViewBinding binding,
                             StudentAdapter adapter) {
        this.mContext = context;
        this.mBinding = binding;
        this.mAdapter = adapter;
    }

    public void addData(View view) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("新加1", 18));
        students.add(new Student("新加2", 28));
        students.add(new Student("新加3", 38));
        mAdapter.getItems().addAll(students);

    }

    public void deleteData(View view) {
        if (mAdapter.getItems().size() > 0)
            mAdapter.getItems().remove(0);
    }
}
  • 效果

这里写图片描述

Demo地址:https://download.csdn.net/download/huangxiaoguo1/10454497

猜你喜欢

转载自blog.csdn.net/huangxiaoguo1/article/details/80548590