你确定自己学会了自定义MarqueeView?这个你会吗?进来看看吧

第一部分: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值