RecyclerView的万能Adapter

源码:RecyclerView的万能Adapter

其余废话不说了,看代码:

封装 Adapter 部分

public abstract class RecyclerCommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> { 
    //item资源ID
    private int mLayoutId;
    //通用参数那么只能使用泛型
    private List<T> mList;
    //实例化View的LayoutInflate
    private LayoutInflater mInflater;
    //多布局支持
    private MultiTypeSupport<T> mMultiTypeSupport;

    public RecyclerCommonAdapter(Context context, List<T> list, int layoutId) {
        this.mInflater = LayoutInflater.from(context);
        this.mList = list;
        this.mLayoutId = layoutId;
    }

    /**
     * 多布局支持
     */
    public RecyclerCommonAdapter(Context context, List<T> data, MultiTypeSupport<T> multiTypeSupport) {
        this(context, data, -1);
        this.mMultiTypeSupport = multiTypeSupport;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //需要多布局
        if (mMultiTypeSupport != null) {
            mLayoutId = viewType;
        }
        
        //创建View 
        View itemView = mInflater.inflate(mLayoutId, parent, false);
        final ViewHolder viewHolder = new ViewHolder(itemView);
        // 设置点击事件
        if (mItemClickListener != null) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (viewHolder.getAdapterPosition() == RecyclerView.NO_POSITION) {
                        return;
                    }
                    mItemClickListener.onItemClick(v, viewHolder.getAdapterPosition());
                }
            });
        }
        //设置长按事件
        if (mItemLongClickListener != null) {
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if (viewHolder.getAdapterPosition() == RecyclerView.NO_POSITION) {
                        return false;
                    }
                    return mItemLongClickListener.onItemLongClick(v, viewHolder.getAdapterPosition());
                }
            });
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        //绑定ViewHolder
        convert(holder, mList.get(position), position);
    }

    /**
     * 根据当前位置获取不同的viewType
     */
    @Override
    public int getItemViewType(int position) {
        if (mMultiTypeSupport != null) {
            return mMultiTypeSupport.getLayoutId(mList.get(position));
        }
        return super.getItemViewType(position);
    }

    /**
     * 绑定数据
     *
     * @param holder
     * @param item     当前数据
     * @param position 当前位置索引
     */
    protected abstract void convert(ViewHolder holder, T item, int position);


    @Override
    public int getItemCount() {
        return mList.size();
    }

    /**
     * 设置点击和长按事件回调
     */
    private OnItemClickListener mItemClickListener;
    private OnItemLongClickListener mItemLongClickListener;

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

    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        this.mItemLongClickListener = listener;
    }
}

ViewHolder部分

public class ViewHolder extends RecyclerView.ViewHolder {
    //缓存ViewHolder中子View减少findViewById的次数
    private SparseArray<View> mViews = new SparseArray<>();

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

    /**
     * 通过viewId获取控件
     *
     * @param viewId
     * @param <T>
     * @return
     */
    public <T extends View> T getView(int viewId) {
        //多次findViewById,对已有的View进行缓存
        View view = mViews.get(viewId);
        //使用缓存的方式减少findViewById的次数
        if (view == null) {
            view = itemView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        if (view == null) {
            throw new NullPointerException("layout中不存在该viewId = " + viewId);
        }
        return (T) view;
    }

    /**
     * 通用的功能进行封装
     * 设置点击事件
     * 采用链式调用
     *
     * @param viewId
     * @param onClickListener
     * @return
     */
    public ViewHolder setOnClickListener(int viewId, View.OnClickListener onClickListener) {
        View view = getView(viewId);
        view.setOnClickListener(onClickListener);
        return this;
    }

    /**
     * 通用的功能进行封装
     * 设置文本
     * 采用链式调用
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, CharSequence text) {
        TextView textView = getView(viewId);
        textView.setText(text);

        return this;
    }

    /**
     * 通用的功能进行封装
     * 设置图片资源
     * 采用链式调用
     *
     * @param viewId
     * @param resourceId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int resourceId) {
        ImageView imageView = getView(viewId);
        imageView.setImageResource(resourceId);
        return this;
    }

    /**
     * 通用的功能进行封装 图片加载处理
     * 设置接口回调
     * 采用链式调用
     *
     * @param viewId
     * @param path
     * @param imageLoader
     * @return
     */
    public ViewHolder setImagePath(int viewId, String path, HolderImageLoader imageLoader) {
        //使用第三方网络加载框架进行封装
        ImageView imageView = getView(viewId);
        imageLoader.loadImage(imageView, path);
        return this;
    }

    /**
     * 图片的加载接口
     */
    public interface HolderImageLoader {

        /**
         * 加载图片
         *
         * @param imageView
         * @param path
         */
        void loadImage(ImageView imageView, String path);

    }
}

代码部分就这么多,有兴趣的童鞋可以对照着自己写一遍。

PS:希望自己技术越来越牛逼!!!

发布了30 篇原创文章 · 获赞 13 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/wjr1949/article/details/78343074