[学习] 鸿洋大大的万能适配器(1)

总结一下

从 ViewHolder 开始学习

public ViewHolder(Context context, View itemView)
    {
        super(itemView);
        mContext = context;
        mConvertView = itemView;
        mViews = new SparseArray<View>();
    }

//这里特意百度了一下 Convert 的意思 皈依 
//所以ConvertView 为依附的视图 
    public static ViewHolder createViewHolder(Context context, View itemView)
    {
        ViewHolder holder = new ViewHolder(context, itemView);
        return holder;
    }
//这是两种新建Viewholder的方法 一种直接传递ConvertView 另一种是传递ItemView的Id 来扩展一个 
    public static ViewHolder createViewHolder(Context context,
                                              ViewGroup parent, int layoutId)
    {
        View itemView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        ViewHolder holder = new ViewHolder(context, itemView);
        return holder;
    }
 /**
     * 通过viewId获取控件
     *
     * @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;
    }

    public View getConvertView()
    {
        return mConvertView;
    }

用view的ID通过getView取得存储在ArrayList 里的View

public ViewHolder setText(int viewId, String text)
    {
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }
     /*
     * 关于事件的
     */
    public ViewHolder setOnClickListener(int viewId,
                                         View.OnClickListener listener)
    {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

就举个例子其他的类似都是通过用set。。。。。。的方法来绑定视图与内容

所以 个人认为 getView 应该为Private 的方法 把她当做内部的方法 才是比较好的封装

viewHolder 就这些东西 存储ConvertView 与众多的子view 通过getView取得视图时如果没有就视图就新建一个视图 把建立与使用 聚合到了一起是不错的做法

View view = mViews.get(viewId);
        if (view == null)
        {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
return view;

那么接下来就该看CommonAdapter

public abstract class CommonAdapter<T> extends MultiItemTypeAdapter<T>
{
    protected Context mContext;
    protected int mLayoutId;
    protected List<T> mDatas;
    protected LayoutInflater mInflater;

    public CommonAdapter(final Context context, final int layoutId, List<T> datas)
    {
        super(context, datas);
        mContext = context;
        mInflater = LayoutInflater.from(context);
        mLayoutId = layoutId;
        mDatas = datas;

        addItemViewDelegate(new ItemViewDelegate<T>()
        {
            @Override
            public int getItemViewLayoutId()
            {
                return layoutId;
            }

            @Override
            public boolean isForViewType( T item, int position)
            {
                return true;
            }

            @Override
            public void convert(ViewHolder holder, T t, int position)
            {
                CommonAdapter.this.convert(holder, t, position);
            }
        });
    }

    protected abstract void convert(ViewHolder holder, T t, int position);


}

很短的代码
在我看来就是两个作用一是绑定了ConvertView 另一个是提供了对外的接口来使用set。。。之类的函数 这么一看 第一种createView的方法有什么用呢?
那么接下来看一下 MultiItemTypeAdapter是干啥子的
MultiItem是多品种的意思 多品种适配器。。
就是为了实现在同一个RecyclerView里匹配许多的adapter来实现多种样式

public MultiItemTypeAdapter(Context context, List<T> datas) {
        mContext = context;
        mDatas = datas;
        mItemViewDelegateManager = new ItemViewDelegateManager();
    }

既然是多类型的适配器那么就需要多个itemView来匹配
类似于ViewHolder 和CommonAdapter的关系 这里 是MultiItemTypeAdapter和ItemViewDeleGateManager
不过本来 CommonAdapter就不过是对MultiItemTypeAdapter 的一个包装而已 就是单类型的 感觉可以简化成多个的一个特例 从而去掉就好
先看一下管理器 再看具体的ItemView

@Override
    public int getItemViewType(int position) {
        if (!useItemViewDelegateManager()) 
            return super.getItemViewType(position);
        return mItemViewDelegateManager
        .getItemViewType(mDatas.get(position), position);
    }

这个感觉是返回了ViewType 用来区分不同的ItemView的
因为涉及到了ItemViewDelegateManager这个类所以一等之后再解释

 @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType);
        int layoutId = itemViewDelegate.getItemViewLayoutId();
        ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId);
        onViewHolderCreated(holder,holder.getConvertView());
        setListener(parent, holder, viewType);
        return holder;
    }
public void onViewHolderCreated(ViewHolder holder,View itemView)
{}
protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) {
        if (!isEnabled(viewType)) return;
        viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnItemClickListener != null) {
                    int position = viewHolder.getAdapterPosition();
                    mOnItemClickListener.onItemClick(v, viewHolder , position);
                }
            }
        });

        viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (mOnItemClickListener != null) {
                    int position = viewHolder.getAdapterPosition();
                    return mOnItemClickListener.onItemLongClick(v, viewHolder, position);
                }
                return false;
            }
        });
    }

这里就很清楚了不过是把所有视图存到了itemViewDelegate里从里取的
ID用ItemView的ID来扩充的

setListener有用吗 不是ViewHolder里有setOnClickListener这个函数吗

不过这个onViewHolderCreated空函数是。。干啥子用的。。 忘删了吗。。。。。。

剩下的都是基本操作 懒得写了
不过看他们说这个库还是有很多问题的。。
不管了先用着

猜你喜欢

转载自blog.csdn.net/weixin_39722329/article/details/80792796