RecycleView在DataBinding上的通用Adapter

DataBinding是google新推出的MVVM框架的实现,类似于前端的AngularJs,可在Xml文件中直接绑定数据源,也可直接通过对应的类名直接获得界面的控件,使用后可抛弃注解框架的使用;RecycleView是ListView,GridView等的结合体,通过进行对RecycleView进行一系列的设置,实现对应的效果,感觉以后可以逐渐取代ListView等控件,在这里简单介绍一下,具体的介绍与使用以后补充。下面是在两者的基础上实现的一个通用的Adapter,可直接实例化setAdapter。
1。BaseViewHolder

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

/**
 * ViewHolder基类(相当于一个界面类,内部存放DataBing类对象,用于之后与数据进行绑定)
 * itemView相当于之前的ContentView
 * Created by yzy on 2016/9/26.
 */
public class BaseViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder{
    private T dataBing;

    public BaseViewHolder(View itemView) {
        super(itemView);
    }

    public T getDataBing() {
        return dataBing;
    }

    public void setDataBing(T dataBing) {
        this.dataBing = dataBing;
    }
}

2。BaseRecycleViewAdapter

import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;


/**
 * RecycleViewAdapter基类(可直接初始化)
 * Created by yzy on 2016/9/26.
 */
public class BaseRecycleViewAdapter<T,K extends ViewDataBinding> extends RecyclerView.Adapter<BaseViewHolder<K>> {

    protected List<T> lists;    //数据源
    protected int resouceId;    //布局ID
    protected int variableId;   //布局内VariableId

    public BaseRecycleViewAdapter(List<T> lists, int resouceId,int variableId) {
        this.lists = lists;
        this.resouceId = resouceId;
        this.variableId = variableId;
    }

    /**
     * 创建绑定数据的ViewHolder(实际上就相当于初始化出来界面)
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public BaseViewHolder<K> onCreateViewHolder(ViewGroup parent, int viewType){
        K itemBing = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),resouceId,parent,false);   //获取DataBing相当于获取View
        BaseViewHolder<K> holder = new BaseViewHolder<K>(itemBing.getRoot());//初始化ViewHolder存放View
        holder.setDataBing(itemBing);
        return holder;
    }

    @Override
    public void onBindViewHolder(final BaseViewHolder<K> holder, final int position){
        T data = lists.get(position);//获取数据
        holder.getDataBing().setVariable(variableId,data);//赋值
        if(listener!=null) {//设置单击事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    listener.onItemClick(holder.getDataBing(),position);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    listener.onLongItemClick(holder.getDataBing(),position);
                    return false;
                }
            });
        }
        holder.getDataBing().executePendingBindings();//刷新界面
    }

    @Override
    public int getItemCount() {
        return lists == null?0:lists.size();
    }

    /**
     * TODO: 对RecyclerView的数据更新,必须remove掉Item以及DataItem,这样才会触发item改变的动画,如果直接调用notifyDataSetChanged则不会触发动画的效果
     */
    /**
     * 插入Item,并且更新界面
     * @param t
     * @param position
     */
    public void addItem(T t , int position){
        if(lists == null){
            lists = new ArrayList<>();
        }
        if(position == -1){
            position = lists.size();
        }
        lists.add(position,t);
        notifyItemInserted(position);
    }

    public void addItem(T t){
        addItem(t,-1);
    }

    /**
     * 添加Items
     * @param ts
     * @param position
     */
    public void addItems(List<T> ts,int position){
        if(lists == null){
            lists = new ArrayList<>();
        }
        if(position == -1){
            position = lists.size();
        }
        lists.addAll(position,ts);
        notifyItemInserted(position);
    }

    public void addItems(List<T> ts){
        addItems(ts,-1);
    }

    /**
     * remove Item
     * @param t
     */
    public void removeItem(T t){
        if(lists == null){
            notifyDataSetChanged();
            return ;
        }
        int position = lists.indexOf(t);
        if(position != -1) {
            lists.remove(t);
            notifyItemRemoved(position);
        }
    }

    public void removeItem(int position){
        if(lists == null){
            notifyDataSetChanged();
            return ;
        }
        if(position>=0 && position<lists.size()) {
            lists.remove(position);
            notifyItemRemoved(position);
        }
    }



    //自定义item单击事件
    protected OnItemClickListener listener;

    public void setListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public interface OnItemClickListener{
        public void onItemClick(ViewDataBinding dataBinding, int position);
        public void onLongItemClick(ViewDataBinding dataBinding,int position);
    }

3。调用

 bing.layoutMenu.funRecyclerviewSetting.setAdapter(new BaseRecycleViewAdapter<Map<String,Object>,FunRecyclerviewItemBinding>(settingData,R.layout.fun_recyclerview_item,BR.dataMap));

总结:代码比较简单,就不一一解释了。就是在使用DataBinding过程中发现,不会自动生成BR文件,每次都是直接手动引入BR文件,以及其中的variableId也会报错,却能编译跑起来,但是总会提示找不到BR类,知道的可以告诉我一声,谢谢!!!

要在 RecyclerViewAdapter 中为按钮设置监听,可以按照以下步骤进行: 1. 在 RecyclerViewAdapter 中创建 ViewHolder,并且在 ViewHolder 中绑定按钮。 2. 在 onCreateViewHolder 方法中,利用 LayoutInflater 实例化 ViewHolder,并将 ViewHolder 对象返回。 3. 在 onBindViewHolder 方法中,为 ViewHolder 中的按钮设置监听器,并在触发事件时弹出 Toast 信息。 在代码中大致实现如下: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { // 数据集 private List<String> mList; // 构造方法 public MyAdapter(List<String> list) { this.mList = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 实例化布局文件 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); // 创建 ViewHolder 对象 ViewHolder viewHolder = new ViewHolder(view); // 返回 ViewHolder 对象 return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { // 获取数据 String text = mList.get(position); // 设置文本显示 holder.mTextView.setText(text); // 设置按钮监听 holder.mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 显示 Toast 信息 Toast.makeText(v.getContext(), "Button is clicked.", Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { // 返回数据集的大小 return mList.size(); } // 创建 ViewHolder 类 public static class ViewHolder extends RecyclerView.ViewHolder { // 控件 public TextView mTextView; public Button mButton; // 构造方法 public ViewHolder(View itemView) { super(itemView); // 绑定控件 mTextView = (TextView) itemView.findViewById(R.id.text_view); mButton = (Button) itemView.findViewById(R.id.button); } } } ``` 其中,item.xml 布局文件中包含 TextView 和 Button。 Hope it helps!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值