为RecyclerView打造万能适配器

为了方便开发,减少代码量,打造万能的RecyclerView的适配器。

1、重写RecyclerView.Adapter<BaseViewHolder>,继承

package com.partjob.commonjar.base;


import java.util.List;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.partjob.commonjar.R;

public abstract class BaseRecyclerAdapter<T> extends
        RecyclerView.Adapter<BaseViewHolder> {

    protected Context context;
    protected List<T> mDatas;

    protected static final int TYPE_ITEM = 0;   //普通的item
    protected static final int TYPE_HEADER = 1;  //第一条item,
    protected static final int TYPE_FOOTER = 2;
    private boolean mEnablePullLoad = false;  //添加尾
    private boolean isShowHeader = false;  //添加头


    public BaseRecyclerAdapter(Context context, List<T> mList) {
        super();
        this.context = context;
        this.mDatas = mList;
    }

    public void setPullLoadEnable(boolean enable) {
        mEnablePullLoad = enable;
    }

    public void setShowHeader(boolean enable) {
        isShowHeader = enable;
    }

    /**
     * TODO<添加数据,指定其位置>
     */

    public void addData(T info, int position) {
        mDatas.add(position, info);
        notifyItemInserted(position);

    }

    /**
     * TODO<添加数据到最后面添加>
     */

    public void addData(T info) {
        mDatas.add(info);
        notifyDataSetChanged();
    }

    /**
     * TODO<删除数据,指定其位置>
     */
    public void deleteData(int position) {
        mDatas.remove(position);
        notifyItemRemoved(position);

    }

    /**
     * TODO<某一位置开始,有itemCount个Item的数据删除>
     */
    public void deleteDataAll(int positionStart, int itemCount) {
        for (int i = positionStart; i < itemCount; i++) {
            mDatas.remove(positionStart);
        }
        notifyItemRangeRemoved(positionStart, itemCount);
    }

    @Override
    public int getItemCount() {
        int size = mDatas.size();
        if (mEnablePullLoad) {
            size++;
        }
        if (isShowHeader) {
            size++;
        }
        return size;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        int mItemLayoutId = 0;

        switch (viewType) {
            case 0:
                mItemLayoutId = onCreateView();
                break;
            case 1:
                mItemLayoutId = onCreateHeaderView();
                break;
            case 2:
                mItemLayoutId = onCreateFootView();
                break;
        }
        View view = View.inflate(viewGroup.getContext(),
                mItemLayoutId, null);
        // 创建一个ViewHolder
        BaseViewHolder holder = new BaseViewHolder(view, viewType);
        return holder;
    }


    /**
     * item的布局文件
     */
    public abstract int onCreateView();

    /**
     * 第一条item的布局文件,如果setShowHeader为true的话,才会调用这里,下拉刷新或则有焦点图的使用
     */
    public int onCreateHeaderView() {
        return 0;
    }

    /**
     * 最后一条item的布局文件,如果setPullLoadEnable为true的话,才会调用这里,上垃加载更多等使用
     */
    public int onCreateFootView() {
        return 0;
    }

    @Override
    public void onBindViewHolder(BaseViewHolder viewHolder,
                                 int position) {
        if (isShowHeader) {
            position--;
        }
        if (viewHolder.getViewType() == 1) {
            convertHeader(viewHolder, position);
        } else if (viewHolder.getViewType() == 2) {
            if (mDatas == null || mDatas.size() == 0) {
                viewHolder.getConvertView().setVisibility(View.GONE);
            } else {
                viewHolder.getConvertView().setVisibility(View.VISIBLE);
            }
            convertFoot(viewHolder, position);
        } else if (viewHolder.getViewType() == 0) {
            if(onItemClickListener!=null){
                final int finalPosition = position;
                viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemClickListener.onItemClick(finalPosition);
                    }
                });

            }
            convert(viewHolder, mDatas.get(position), position);
        }
    }

    /**
     * 把onBindViewHolder的内容放在这个方法写就可以了
     */
    public abstract void convert(BaseViewHolder helper,
                                 T item, int position);


    /**
     * 头部自定义处理的适配器,头部的onBindViewHolder写在这里
     */
    public void convertHeader(BaseViewHolder helper, int position) {

    }

    /**
     * 底部自定义处理的适配器,底部的onBindViewHolder写在这里
     */
    public void convertFoot(BaseViewHolder helper, int position) {

    }

    @Override
    public int getItemViewType(int position) {
        // 最后一个item设置为footerView
        if (position + 1 == getItemCount() && mEnablePullLoad) {
            return TYPE_FOOTER;
        }
        if (position == 0 && isShowHeader) {
            return TYPE_HEADER;
        }
        return TYPE_ITEM;
    }


    //RecyclerView没有Item点击标签,为RecyclerView打造点击事件
    private OnItemClickListener onItemClickListener;
    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener = onItemClickListener;
    }
    public interface  OnItemClickListener{
        void onItemClick(int position);
    }

}

2、重写RecyclerView.ViewHolder

package com.partjob.commonjar.base;

import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;

public class BaseViewHolder extends RecyclerView.ViewHolder {
    private final SparseArray<View> mViews;
    private View mConvertView;
    private int viewType = 0;

    public BaseViewHolder(View itemView) {
        this(itemView, 0);
    }
    public BaseViewHolder(View itemView,int viewType) {
        super(itemView);
        this.viewType = viewType;
        this.mConvertView = itemView;
        this.mViews = new SparseArray<>();
    }

    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     *
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    /**
     * 为TextView设置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public RecyclerView.ViewHolder setText(int viewId, String text) {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }

    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
   
3、只需要这两个类就可以了,下面我们看看使用,大家模仿着这样写就可以了,RecyclerView直接使用这个适配器继就可以了<pre name="code" class="java">/**
 * 新闻列表页的适配器
 */
public class PhotoAdapter extends BaseRecyclerAdapter<PhotoDataContext> {
    private StyleUtils mStyleUtils = StyleUtils.getColorsUtils();
    private XBitmapUtils mXBitmapUtils1, mXBitmapUtils2, mXBitmapUtils3, mXBitmapUtils4;


    public PhotoAdapter(BaseActivity activity, List<PhotoDataContext> data) {
        super(activity, data);
        mXBitmapUtils1 = new XBitmapUtils(activity, R.drawable.photo_bighor, R.drawable.photo_bighor);
        mXBitmapUtils2 = new XBitmapUtils(activity, R.drawable.photo_ver, R.drawable.photo_ver);
        mXBitmapUtils3 = new XBitmapUtils(activity, R.drawable.photo_pethor, R.drawable.photo_pethor);
    }


    @Override
    public int onCreateView() {
        return R.layout.adapter_photo;
    }

    @Override
    public void convert(BaseViewHolder helper, PhotoDataContext item, int position) {
        ImageView photoBigImg = helper.getView(R.id.photo_big_img);
        ImageView photoVerImg1 = helper.getView(R.id.photo_ver_img1);
        ImageView photoVerImg2 = helper.getView(R.id.photo_ver_img2);
        ImageView photoPetImg1 = helper.getView(R.id.photo_pet_img1);
        ImageView photoPetImg2 = helper.getView(R.id.photo_pet_img2);
        ImageView photoPetImg3 = helper.getView(R.id.photo_pet_img3);
        ImageView photoPetImg4 = helper.getView(R.id.photo_pet_img4);
        ImageView photoPetImg5 = helper.getView(R.id.photo_pet_img5);
        ImageView photoPetImg6 = helper.getView(R.id.photo_pet_img6);
        TextView photoTitle = helper.getView(R.id.photo_title);
        TextView photoNum = helper.getView(R.id.photo_num);
        TextView photoTime = helper.getView(R.id.photo_time);
        View photoLine = helper.getView(R.id.photo_line);
        photoTitle.setText(item.getTitle());
        int num = item.getChildCount() - 1;
        photoNum.setText(String.valueOf(num));
        photoTime.setText(DateUtils.getTime(item.getTime()));
    }


    @Override
    public int onCreateHeaderView() {
        return R.layout.viewpage_news_top;
    }

    @Override
    public int onCreateFootView() {
        return R.layout.view_footer_loading;
    }

    public void convertFoot(BaseViewHolder helper, int position) {
        TextView footerItemText = helper.getView(R.id.footer_item_text);  //下拉框的字体颜色
        footerItemText.setTextColor(mStyleUtils.getBlackWordColor());
    }

}

自己刚写博客,表达能力有限,请多多支持
 
 
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值