第六篇为多条目的多布局
package com.example.recyclerview.recycler.provider;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import com.example.recyclerview.recycler.BaseQuickAdapter;
import com.example.recyclerview.recycler.BaseViewHolder;
import java.util.List;
public abstract class BaseProviderMultiAdapter<T, VH extends BaseViewHolder> extends BaseQuickAdapter<T, VH> {
private final SparseArray<BaseItemProvider<T, VH>> mItemProviders = new SparseArray<>();
/**
* 返回 item 类型
*/
protected abstract int getItemType(List<T> data, int position);
/**
* 必须通过此方法,添加 provider
*
* @param provider BaseItemProvider
*/
public void addItemProvider(BaseItemProvider<T, VH> provider) {
provider.setAdapter(this);
mItemProviders.put(provider.itemViewType, provider);
}
public BaseProviderMultiAdapter(List<T> data) {
super(0, data);
}
@Override
protected VH onCreateDefViewHolder(ViewGroup parent, int viewType) {
BaseItemProvider<T, VH> provider = getItemProvider(viewType);
provider.context = parent.getContext();
VH baseViewHolder = provider.onCreateViewHolder(parent, viewType);
provider.onViewHolderCreated(baseViewHolder, viewType);
return baseViewHolder;
}
public int getDefItemViewType(int position) {
return getItemType(data, position);
}
public void convert(VH holder, T item, int position) {
getItemProvider(holder.getItemViewType()).convert(holder, item, position);
}
public void update(VH holder, T item, List<Object> payloads) {
getItemProvider(holder.getItemViewType()).update(holder, item, payloads);
}
public void bindViewClickListener(VH viewHolder, int position) {
super.bindViewClickListener(viewHolder, position);
bindClick(viewHolder);
bindChildClick(viewHolder);
}
protected void bindClick(final VH viewHolder) {
if (getOnItemClickListener() == null) {
//如果没有设置点击监听,则回调给 itemProvider
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = viewHolder.getAdapterPosition();
int itemViewType = viewHolder.getItemViewType();
BaseItemProvider<T, VH> provider = mItemProviders.get(itemViewType);
provider.onClick(viewHolder, v, data.get(position), position);
}
});
}
if (getOnItemLongClickListener() == null) {
//如果没有设置长按监听,则回调给itemProvider
viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = viewHolder.getAdapterPosition();
int itemViewType = viewHolder.getItemViewType