美文网首页android基础知识
[老实李] DataBinding中RecycleView及Li

[老实李] DataBinding中RecycleView及Li

作者: 老实李 | 来源:发表于2017-04-28 14:26 被阅读140次

一、首先来看RecycleView。

1、BaseViewHolder的封装

/**
* Created by zhenquan on 2017/4/28.
*/

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的封装

/**
* Created by zhenquan on 2017/4/28.
*/

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、使用

recycleView.setLayoutManager(new LinearLayoutManager(mContext,LinearLayoutManager.VERTICAL,false));
recycleView.setHasFixedSize(true);

mPlistBeanViewDataBindingBaseRecycleViewAdapter = new BaseRecycleViewAdapter<>(mData, R.layout.etlist_item, BR.expertInfo);   //三个参数:数据集合,条目布局文件,BR中对应的id
recycleView.setAdapter(mPlistBeanViewDataBindingBaseRecycleViewAdapter);

二、Listiew的BaseAdapter抽取

1、BaseListAdapter抽取

/**
* Created by zhenquan on 2017/4/24.
*/

public class BaseListAdapter<T> extends BaseAdapter {
    private Context context;
    private LayoutInflater inflater;
    private int layoutId;
    private int variableId;
    private List<T> list;

    public BaseListAdapter(Context context, int layoutId, List<T> list, int resId) {
        this.context = context;
        this.layoutId = layoutId;
        this.list = list;
        this.variableId = resId;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewDataBinding dataBinding;
        if (convertView == null) {
            dataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        }else{
            dataBinding = DataBindingUtil.getBinding(convertView);
        }
        dataBinding.setVariable(variableId, list.get(position));
        return dataBinding.getRoot();
    }
}

2、使用

listAdapter = new BaseListAdapter(mContext, R.layout.etlist_item, mData, BR.expertInfo);
mListEtlist.setAdapter(listAdapter);

有了这几个类,再做DataBinding中的条目展示是不是就很easy了呢~后面我们就只需要关注modle层和view层之间的互动就可以了。可以参考http://blog.csdn.net/u012702547/article/details/52077515

相关文章

网友评论

    本文标题:[老实李] DataBinding中RecycleView及Li

    本文链接:https://www.haomeiwen.com/subject/vzoozttx.html