具体使用可参照源址:
https://blog.csdn.net/a_zhon/article/details/66971369

1.BaseRecyclerViewAdapter.java

package com.lt.test_util.base;

import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;

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

/**
 * @作者: LinTan
 * @日期: 2018/12/12 12:10
 * @版本: 1.3
 * @描述: //RecyclerView的封装类。注意引入依赖。
 * 源址: https://blog.csdn.net/a_zhon/article/details/66971369
 * 1.0: Initial Commit
 * 1.1: 替换数据操作的视图更改方式,由notifyDataSetChanged()改为notifyItemXXXX(),提高性能
 * ***  注意: notifyItemXXXX()修改视图不会重新执行onBindViewHolder(),
 * ***       导致了position错乱,所以需要调用notifyItemRangeChanged()重新计算position
 * 1.2: 修复addHeadView后,数据操作时position异常问题
 * 1.3: 修复LayoutManager为网格或瀑布流时,HeadView与FootView不能占满一行的问题
 * 1.4: 优化RecyclerView性能,将ItemView的findViewById和点击事件的初始化移至onCreateViewHolder()
 * 1.5: 发现Bug,1.4版优化后会导致数据源随RecyclerView的ItemView复用,故Return
 * <p>
 * implementation 'com.android.support:recyclerview-v7:28.0.0'
 */

public abstract class BaseRecyclerViewAdapter<DS, VH extends ViewHolder> extends Adapter<VH>
        implements OnClickListener, OnLongClickListener {//DS:DataSource,VH:ViewHolder
    private final int VIEW_TYPE_ITEM = 1008601;
    private final int VIEW_TYPE_HEAD = 1008602;
    private final int VIEW_TYPE_FOOT = 1008603;
    private int mItemViewId;
    private int mHeadViewId = -1;
    private int mFootViewId = -1;
    private List<DS> mDataSourceList;
    private OnItemClickListener mItemClickListener;
    private OnItemLongClickListener mItemLongClickListener;

    public BaseRecyclerViewAdapter(@LayoutRes int layoutResId, List<DS> DataSourceList) {
        if (layoutResId == 0) {
            throw new NullPointerException("请设置item资源id");
        } else {
            mItemViewId = layoutResId;
        }
        if (DataSourceList == null) {
            mDataSourceList = new ArrayList<>();
        } else {
            mDataSourceList = DataSourceList;
        }
    }

    @SuppressWarnings("unchecked")
    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View view;
        switch (viewType) {
            case VIEW_TYPE_HEAD:
                view = LayoutInflater.from(viewGroup.getContext())
                                     .inflate(mHeadViewId, viewGroup, false);
                break;
            case VIEW_TYPE_FOOT:
                view = LayoutInflater.from(viewGroup.getContext())
                                     .inflate(mFootViewId, viewGroup, false);
                break;
            default:
                view = LayoutInflater.from(viewGroup.getContext())
                                     .inflate(mItemViewId, viewGroup, false);
                view.setOnClickListener(this);
                view.setOnLongClickListener(this);
                break;
        }
        return (VH) new BaseViewHolder(view);
    }//创建视图管理器

    @Override
    public void onBindViewHolder(@NonNull VH viewHolder, int position) {
        switch (viewHolder.getItemViewType()) {
            case VIEW_TYPE_HEAD:
                break;
            case VIEW_TYPE_FOOT:
                break;
            default:
                if (mHeadViewId == -1) {
                    viewHolder.itemView.setTag(position);
                    bindView(viewHolder);
                    initView(viewHolder.itemView.getContext(), mDataSourceList.get(position),
                             position);
                    initListener(viewHolder);
                }//无HeadView时的处理
                else {
                    viewHolder.itemView.setTag(position - 1);
                    bindView(viewHolder);
                    initView(viewHolder.itemView.getContext(), mDataSourceList.get(position - 1),
                             (position - 1));
                    initListener(viewHolder);
                }//有HeadView时的处理
                break;
        }
    }//绑定数据到视图

    @Override
    public int getItemCount() {
        if (mHeadViewId != -1 && mFootViewId != -1) {
            return mDataSourceList.size() + 2;
        }//若同时添加HeadView与FootView,数据源大小+2
        if (mHeadViewId != -1 || mFootViewId != -1) {
            return mDataSourceList.size() + 1;
        }//若仅添加HeadView或FootView其一,数据源大小+1
        return mDataSourceList.size();//仅有ItemView,数据源大小正常
    }//获取数据源的大小

    @Override
    public int getItemViewType(int position) {
        int viewType = VIEW_TYPE_ITEM;
        if (position == 0 && mHeadViewId != -1) {
            viewType = VIEW_TYPE_HEAD;
        }//判断是否添加了HeadView
        if (position == getItemCount() - 1 && mFootViewId != -1) {
            viewType = VIEW_TYPE_FOOT;
        }//判断是否添加了FootView
        return viewType;
    }//获取ItemView的类型

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager viewLayoutManager = recyclerView.getLayoutManager();
        if (viewLayoutManager instanceof GridLayoutManager) {
            final GridLayoutManager gridLayoutManager = (GridLayoutManager) viewLayoutManager;
            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    switch (getItemViewType(position)) {
                        case VIEW_TYPE_HEAD:
                            return gridLayoutManager.getSpanCount();
                        case VIEW_TYPE_FOOT:
                            return gridLayoutManager.getSpanCount();
                        default:
                            return 1;
                    }
                }
            });
        }
    }//当LayoutManager为GridLayoutManager时,让HeadView与FootView占满所在行

    @Override
    public void onViewAttachedToWindow(@NonNull VH viewHolder) {
        super.onViewAttachedToWindow(viewHolder);
        ViewGroup.LayoutParams viewGroupLayoutParams = viewHolder.itemView.getLayoutParams();
        if (viewGroupLayoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
            StaggeredGridLayoutManager.LayoutParams sglManagerLayoutParams
                    = (StaggeredGridLayoutManager.LayoutParams) viewGroupLayoutParams;
            switch (getItemViewType(viewHolder.getLayoutPosition())) {
                case VIEW_TYPE_HEAD:
                    sglManagerLayoutParams.setFullSpan(true);
                case VIEW_TYPE_FOOT:
                    sglManagerLayoutParams.setFullSpan(true);
            }
        }
    }//当LayoutManager为StaggeredGridLayoutManager时,让HeadView与FootView占满所在行

    public void addHeadView(@LayoutRes int layoutResId) {
        mHeadViewId = layoutResId;
    }//添加HeadView

    public void addFootView(@LayoutRes int layoutResId) {
        mFootViewId = layoutResId;
    }//添加FootView

    public void addData(DS dataSource) {
        int oldDataSourceListSize = mDataSourceList.size();
        mDataSourceList.add(dataSource);
        if (mHeadViewId == -1) {
            notifyItemInserted(oldDataSourceListSize);
            notifyItemRangeChanged(oldDataSourceListSize, 0);
        } else {
            notifyItemInserted(oldDataSourceListSize + 1);
            notifyItemRangeChanged(oldDataSourceListSize + 1, 0);
        }
    }//添加数据

    public void delData(int position) {
        int oldDataSourceListSize = mDataSourceList.size();
        mDataSourceList.remove(position);
        if (mHeadViewId == -1) {
            notifyItemRemoved(position);
            notifyItemRangeChanged(position,
                                   oldDataSourceListSize - position);
        } else {
            notifyItemRemoved(position + 1);
            notifyItemRangeChanged(position + 1,
                                   oldDataSourceListSize - position);
        }
    }//删除数据

    public void clearData() {
        int oldDataSourceListSize = mDataSourceList.size();
        mDataSourceList.clear();
        if (mHeadViewId == -1) {
            notifyItemRangeRemoved(0, oldDataSourceListSize);
        } else {
            notifyItemRangeRemoved(1, oldDataSourceListSize);
        }
    }//清空数据

    public void refreshData(List<DS> dataSourceList) {
        int oldDataSourceListSize = mDataSourceList.size();
        int newDataSourceListSize = dataSourceList.size();
        if (mHeadViewId == -1) {
            mDataSourceList.clear();
            notifyItemRangeRemoved(0, oldDataSourceListSize);
            mDataSourceList.addAll(dataSourceList);
            notifyItemRangeInserted(0, newDataSourceListSize);
        } else {
            mDataSourceList.clear();
            notifyItemRangeRemoved(1, oldDataSourceListSize);
            mDataSourceList.addAll(dataSourceList);
            notifyItemRangeInserted(1, newDataSourceListSize);
        }
    }//刷新数据

    public void loadMoreData(List<DS> dataSourceList) {
        int oldDataSourceListSize = mDataSourceList.size();
        int newDataSourceListSize = dataSourceList.size();
        mDataSourceList.addAll(dataSourceList);
        if (mHeadViewId == -1) {
            notifyItemRangeInserted(oldDataSourceListSize, newDataSourceListSize);
        } else {
            notifyItemRangeInserted(oldDataSourceListSize + 1, newDataSourceListSize);
        }
    }//加载更多数据

    public void setItemClickListener(OnItemClickListener itemClickListener) {
        mItemClickListener = itemClickListener;
    }//item点击监听器

    public void setItemLongClickListener(OnItemLongClickListener itemLongClickListener) {
        mItemLongClickListener = itemLongClickListener;
    }//item长点击监听器

    @Override
    public void onClick(View view) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(view, (Integer) view.getTag());
        }
    }//点击回调

    @Override
    public boolean onLongClick(View view) {
        boolean b = false;
        if (mItemLongClickListener != null) {
            b = mItemLongClickListener.onItemLongClick(view, (Integer) view.getTag());
        }
        return b;
    }//长点击回调

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }//item点击监听器的接口

    public interface OnItemLongClickListener {
        boolean onItemLongClick(View view, int position);
    }//item长点击监听器的接口

    protected abstract void bindView(VH viewHolder);

    protected abstract void initView(Context context, DS dataSource, int position);

    protected abstract void initListener(VH viewHolder);
}

2.BaseViewHolder.java

package com.lt.test_util.base;

import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @作者: LinTan
 * @日期: 2018/12/12 12:10
 * @版本: 1.0
 * @描述: //RecyclerView的封装类。注意引入依赖。
 * 源址: https://blog.csdn.net/a_zhon/article/details/66971369
 * 1.0: Initial Commit
 * <p>
 * implementation 'com.android.support:recyclerview-v7:28.0.0'
 */

public class BaseViewHolder extends ViewHolder {
    private SparseArray<View> mViewSparseArray;//Key为View的Id,Value为View对象

    public BaseViewHolder(@NonNull View itemView) {
        super(itemView);
        mViewSparseArray = new SparseArray<>();
    }

    @SuppressWarnings("unchecked")
    public <T extends View> T findViewById(int viewId) {
        View view = mViewSparseArray.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViewSparseArray.put(viewId, view);
        }
        return (T) view;
    }//findViewById,并存储到SparseArray中

    public ImageView setImageResource(int viewId, @DrawableRes int imageResId) {
        ImageView view = findViewById(viewId);
        view.setImageResource(imageResId);
        return view;
    }//设置图片

    public TextView setText(int viewId, CharSequence s) {
        TextView view = findViewById(viewId);
        view.setText(s);
        return view;
    }//设置文本
}
分类: PL_Android

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。