1. 程式人生 > >android:DataBinding使用小結(三)

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);
    }
}
  • 效果

這裡寫圖片描述