BaseQuickAdapter萬能適配器實現分類型

多佈局

對於多佈局,提供了:

BaseMultiItemQuickAdapterBaseDelegateMultiAdapterBaseProviderMultiAdapter

三種基礎類型。

1、BaseMultiItemQuickAdapter

說明:適用於類型較少,業務不復雜的場景,便於快速使用。

所有的數據類型,都必須實現MultiItemEntity接口(注意,這裏不是繼承抽象類,而是實現接口,避免對業務的實體類帶來影響)

public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<QuickMultipleEntity, BaseViewHolder> {

    public MultipleItemQuickAdapter(List<QuickMultipleEntity> data) {
        super(data);
        // 綁定 layout 對應的 type
        addItemType(QuickMultipleEntity.TEXT, R.layout.item_text_view);
        addItemType(QuickMultipleEntity.IMG, R.layout.item_image_view);
        addItemType(QuickMultipleEntity.IMG_TEXT, R.layout.item_img_text_view);
    }

    @Override
    protected void convert(@NonNull BaseViewHolder helper, QuickMultipleEntity item) {
        // 根據返回的 type 分別設置數據
        switch (helper.getItemViewType()) {
            case QuickMultipleEntity.TEXT:
                helper.setText(R.id.tv, item.getContent());
                break;
            case QuickMultipleEntity.IMG_TEXT:
                ...
                ...
                break;
            default:
                break;
        }
    }
}

數據實體類寫法:

class 你的數據實體類 implements MultiItemEntity {
  
  // 你的數據內容
  ...
  ...
  
  /**
   * 實現此方法,返回類型
   */
  @Override
    public int getItemType() {
        return itemType;
    }
}

2、BaseDelegateMultiAdapter

說明:通過代理類的方式,返回佈局 id 和 item 類型;

適用於:
1、實體類不方便擴展,此Adapter的數據類型可以是任意類型,只需要在BaseMultiTypeDelegate.getItemType中返回對應類型
2、item 類型較少
如果類型較多,爲了方便隔離各類型的業務邏輯,推薦使用BaseProviderMultiAdapter

方式一:

public class DelegateMultiAdapter extends BaseDelegateMultiAdapter<DelegateMultiEntity, BaseViewHolder> {

    public DelegateMultiAdapter() {
        super();
        
        // 第一步,設置代理
        setMultiTypeDelegate(new BaseMultiTypeDelegate<DelegateMultiEntity>() {
            @Override
            public int getItemType(@NotNull List<? extends DelegateMultiEntity> data, int position) {
                // 根據數據,自己判斷應該返回的類型
                switch (position % 3) {
                    case 0:
                        return DelegateMultiEntity.TEXT;
                    case 1:
                        return DelegateMultiEntity.IMG;
                    case 2:
                        return DelegateMultiEntity.IMG_TEXT;
                    default:
                        break;
                }
                return 0;
            }
        });
        // 第二部,綁定 item 類型
        getMultiTypeDelegate()
                .addItemType(DelegateMultiEntity.TEXT, R.layout.item_text_view)
                .addItemType(DelegateMultiEntity.IMG, R.layout.item_image_view)
                .addItemType(DelegateMultiEntity.IMG_TEXT, R.layout.item_img_text_view);
    }

    @Override
    protected void convert(@NotNull BaseViewHolder helper, @NotNull DelegateMultiEntity item) {
        switch (helper.getItemViewType()) {
            case QuickMultipleEntity.TEXT:
                helper.setText(R.id.tv, "CymChad " + helper.getAdapterPosition());
                break;
            case QuickMultipleEntity.IMG_TEXT:
                switch (helper.getLayoutPosition() % 2) {
                    case 0:
                        helper.setImageResource(R.id.iv, R.mipmap.animation_img1);
                        break;
                    case 1:
                        helper.setImageResource(R.id.iv, R.mipmap.animation_img2);
                        break;
                    default:
                        break;
                }
                helper.setText(R.id.tv, "ChayChan " + helper.getAdapterPosition());
                break;
            default:
                break;
        }
    }
}

方式二:

public class DelegateMultiAdapter extends BaseDelegateMultiAdapter<DelegateMultiEntity, BaseViewHolder> {

    public DelegateMultiAdapter() {
        super();

        // 實現自己的代理類:
        setMultiTypeDelegate(new MyMultiTypeDelegate());
    }

    @Override
    protected void convert(@NotNull BaseViewHolder helper, @NotNull DelegateMultiEntity item) {
        switch (helper.getItemViewType()) {
            case QuickMultipleEntity.TEXT:
                helper.setText(R.id.tv, "CymChad " + helper.getAdapterPosition());
                break;
            case QuickMultipleEntity.IMG_TEXT:
                switch (helper.getLayoutPosition() % 2) {
                    case 0:
                        helper.setImageResource(R.id.iv, R.mipmap.animation_img1);
                        break;
                    case 1:
                        helper.setImageResource(R.id.iv, R.mipmap.animation_img2);
                        break;
                    default:
                        break;
                }
                helper.setText(R.id.tv, "ChayChan " + helper.getAdapterPosition());
                break;
            default:
                break;
        }
    }

    // 方式二:實現自己的代理類
    final static class MyMultiTypeDelegate extends BaseMultiTypeDelegate<DelegateMultiEntity> {

        public MyMultiTypeDelegate() {
            // 綁定 item 類型
            addItemType(DelegateMultiEntity.TEXT, R.layout.item_text_view);
            addItemType(DelegateMultiEntity.IMG, R.layout.item_image_view);
            addItemType(DelegateMultiEntity.IMG_TEXT, R.layout.item_img_text_view);
        }

        @Override
        public int getItemType(@NotNull List<? extends DelegateMultiEntity> data, int position) {
            switch (position % 3) {
                case 0:
                    return DelegateMultiEntity.TEXT;
                case 1:
                    return DelegateMultiEntity.IMG;
                case 2:
                    return DelegateMultiEntity.IMG_TEXT;
                default:
                    break;
            }
            return 0;
        }
    }
}

3、BaseProviderMultiAdapter

說明:當有多種條目的時候,避免在convert()中做太多的業務邏輯,把邏輯放在對應的 ItemProvider 中。以及最大化自定義VH類型。

1、此Adapter的數據類型可以是任意類型,只需要在getItemType中返回對應類型
2、Adapter不限定ViewHolder類型。ViewHolderBaseItemProvider 實現,並且每個BaseItemProvider可以擁有自己類型的ViewHolder類型。

第一步,Adapter代碼如下:

public class ProviderMultiAdapter extends BaseProviderMultiAdapter<ProviderMultiEntity> {

    public ProviderMultiAdapter() {
        super();
        // 註冊 Provider
        addItemProvider(new ImgItemProvider());
        addItemProvider(new TextImgItemProvider());
        addItemProvider(new TextItemProvider());
    }

    /**
     * 自行根據數據、位置等信息,返回 item 類型
     */
    @Override
    protected int getItemType(@NotNull List<? extends ProviderMultiEntity> data, int position) {
        switch (position % 3) {
            case 0:
                return ProviderMultiEntity.IMG;
            case 1:
                return ProviderMultiEntity.TEXT;
            case 2:
                return ProviderMultiEntity.IMG_TEXT;
            default:
                break;
        }
        return 0;
    }
}

第二步,Provider代碼如下:

public class ImgItemProvider extends BaseItemProvider<ProviderMultiEntity> {

    // item 類型
    @Override
    public int getItemViewType() {
        return ProviderMultiEntity.IMG;
    }

    // 返回 item 佈局 layout
    @Override
    public int getLayoutId() {
        return R.layout.item_image_view;
    }
  
    /*
     * (可選)
     * 重寫返回自己的 ViewHolder。
     * 默認返回 BaseViewHolder()
     */
    @NotNull
    @Override
    public BaseViewHolder onCreateViewHolder(@NotNull ViewGroup parent) {
        return super.onCreateViewHolder(parent);
    }

    @Override
    public void convert(@NotNull BaseViewHolder helper, @NotNull ProviderMultiEntity data) {
        // 設置 item 數據
        if (helper.getAdapterPosition() % 2 == 0) {
            helper.setImageResource(R.id.iv, R.mipmap.animation_img1);
        } else {
            helper.setImageResource(R.id.iv, R.mipmap.animation_img2);
        }
    }
 
    // 點擊 item 事件
    @Override
    public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, ProviderMultiEntity data, int position) {
        Tips.show("Click: " + position);
    }

    @Override
    public boolean onLongClick(@NotNull BaseViewHolder helper, @NotNull View view, ProviderMultiEntity data, int position) {
        Tips.show("Long Click: " + position);
        return true;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章