Recyclerview适配器2.0(六)——多条目多布局

第六篇为多条目的多布局

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值