总结一下
从 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空函数是。。干啥子用的。。 忘删了吗。。。。。。
剩下的都是基本操作 懒得写了
不过看他们说这个库还是有很多问题的。。
不管了先用着