第一部分:MultiItemTypeAdapter 相关
第二部分:MarqueeView 与 MultiItemTypeAdapter 之间实质怎样建立联系的
MultiItemTypeAdapter 讲解
讲解 MultiItemTypeAdapter 之前,我们先来看一下相应的接口 ItemViewDelegate 和类 ItemViewDelegateManager
- ItemViewDelegate
而 ItemViewDelegateManager 主要是管理 ItemViewDelegate 的。
public interface ItemViewDelegate {
public abstract int getItemViewLayoutId();
public abstract boolean isForViewType(T item, int position);
public abstract void convert(ViewHolder holder, T t, int position);
}
ItemViewDelegate 主要有三个方法,getItemViewLayoutId 方法表示获取 ItemViewLayoutId,isForViewType 会根据 item 即 position 判断当前的 item 是不是属于当前的 ItemViewDelegate,convert 在刷新当前 item 的时候会调用。
- ItemViewDelegateManager
ItemViewDelegateManager,没错,从字面意思来看,就是来管理 ItemViewDelegate 的。接下来我们来看 ItemViewDelegateManager 里面几个比较重要的方法。
-
当有指定 viewType会先去缓存里面查找是否存在相应的 delegate,如果存在,不合法,抛出异常。因为同一时刻只有一个 delegate 能处理该 position;
-
当没有指定 viewType 的时候,我们会以当前 delegates 的容量作为 key 存进 SparseArrayCompat 中。
SparseArrayCompat<ItemViewDelegate> delegates = new SparseArrayCompat();
public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) {
if (delegates.get(viewType) != null) {
throw new IllegalArgumentException(“An ItemViewDelegate is already registered for the” +
" viewType = " + viewType + ". Already registered ItemViewDelegate is " +
delegates.get(viewType));
}
delegates.put(viewType, delegate);
return this;
}
public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) {
int viewType = delegates.size();
if (delegate != null) {
delegates.put(viewType, delegate);
viewType++;
}
return this;
}
因此,我们如果想获取对应 position 的 viewType,可以通过 delegate 在 delegates 中对应的 key
于是衍生出以下方法:
即根据当前 postion,去查找相应的 delegate,然后再获取通过 delegate 在 delegates 数组中对应的 key,即我们的 viewType
public int getItemViewType(T item, int position) {
int delegatesCount = delegates.size();
for (int i = delegatesCount - 1; i >= 0; i–) {
ItemViewDelegate delegate = delegates.valueAt(i);
if (delegate.isForViewType(item, position)) {
return delegates.keyAt(i);
}
}
throw new IllegalArgumentException(“No ItemViewDelegate added that matches position=” +
position + " in data source");
}
MultiItemTypeAdapter 讲解
主要有几个重要的方法:
public View createItemView(ItemVie