优化recyclerview的adapter代码

来源:互联网 发布:淘宝卖家号购买 编辑:程序博客网 时间:2024/05/21 17:33

我们写一个baseadapter代码,将recyclerview的公共部分抽离出来,然后提供接口

代码中使用了databinding

BaseAdapter.java

package com.yiba.oops.utils;import android.content.Context;import android.databinding.ViewDataBinding;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import com.yiba.oops.APP;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016/9/1. * READ ME * 对recyclerview的adapter和viewholder进行抽取,主要包含binding和item的点击事件,需要其他的可以自己添加 */public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseAdapter.BaseViewHolder> {    protected List<T> mList = new ArrayList<>();    protected Context mContext;    private OnRecyclerItemClickListener mOnRecyclerItemClickListener;    public interface OnRecyclerItemClickListener {        boolean onRecyclerItemClick(RecyclerView.ViewHolder holder, View view, int position);    }    public BaseAdapter(List<T> list) {        mContext = APP.getContext();        mList = list;    }    @Override    public BaseAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        ViewDataBinding binding = getBinding(parent, viewType);        return new BaseViewHolder(binding);    }    /**     * 获取binding对象     */    protected abstract ViewDataBinding getBinding(ViewGroup parent, int viewType);    @Override    public void onBindViewHolder(BaseAdapter.BaseViewHolder holder, int position) {        onBindingViewHolder(holder, position);    }    /**     * 绑定viewholder     **/    protected abstract void onBindingViewHolder(BaseAdapter.BaseViewHolder holder, int position);    @Override    public int getItemCount() {        return mList == null ? 0 : mList.size();    }    public void setOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerItemClickListener) {        mOnRecyclerItemClickListener = onRecyclerItemClickListener;    }    public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {        private ViewDataBinding binding;        public BaseViewHolder(View itemView) {            super(itemView);            initListener();        }        public BaseViewHolder(ViewDataBinding binding) {            super(binding.getRoot());            this.binding = binding;            initListener();        }        private void initListener() {            itemView.setOnClickListener(this);        }        @Override        public void onClick(View view) {            if (mOnRecyclerItemClickListener != null) {                mOnRecyclerItemClickListener.onRecyclerItemClick(this, view, getAdapterPosition());            }        }        public ViewDataBinding getBinding() {            return binding;        }    }}

使用:

例:

ShareAdapter.java

/** * Created by ${xiaopao} on 2016/9/7. */public class ShareAdapter extends BaseAdapter<ShareFriends> {//BaseAdapter<ShareFriends> //继承BaseAdapter,<ShareFriends>是item的对象    public ShareAdapter(List<ShareFriends> list) {        super(list);    }    @Override    protected ViewDataBinding getBinding(ViewGroup parent, int viewType) {        //这里返回databinding对象        return DataBindingUtil.inflate(                LayoutInflater.from(mContext),                R.layout.item_share_friends,                parent,                false        );    }//这里进行item布局内容的设置    @Override    protected void onBindingViewHolder(BaseAdapter.BaseViewHolder holder, final int position) {        final ShareItemBinding sharebinding = (ShareItemBinding) holder.getBinding();        ShareFriends f = mList.get(position);//        LogUtil.HDLog("name:" + f.getName() + "  icon: " + f.getIcon());        String iconurl = f.getIcon();        String name = f.getName();        sharebinding.shareName.setText(name);        Glide.with(mContext)                .load(iconurl)                .transform(new GlideCircleTransform(mActivity))                .placeholder(R.mipmap.ic_launcher)                .error(R.mipmap.ic_launcher)                .crossFade()                .into(sharebinding.shareImg);        if (mList.get(position).isChecked()) {            sharebinding.shareCheck.setImageResource(R.drawable.selected);        } else {            sharebinding.shareCheck.setImageResource(R.drawable.unseleted);        }    }}

如果要增加点击事件:
//只需要设置setOnRecyclerItemClickListener即可。

adapter.setOnRecyclerItemClickListener(new BaseAdapter.OnRecyclerItemClickListener() {            @Override            public boolean onRecyclerItemClick(RecyclerView.ViewHolder holder, View view, int position) {                if (sharelist.get(position).isChecked()) {                    sharelist.get(position).setChecked(false);                } else {                    sharelist.get(position).setChecked(true);                }                adapter.notifyDataSetChanged();                return true;            }        });

BaseAdapter.java可以复制到工程里直接使用

1 0