BaseQuickAdapter万能适配器--分类型实现多布局效果的3个适配器
Posted LQS_Android
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BaseQuickAdapter万能适配器--分类型实现多布局效果的3个适配器相关的知识,希望对你有一定的参考价值。
在BaseQuickAdapter万能适配器中提供了3个多布局适配器BaseMultiItemQuickAdapter、BaseDelegateMultiAdapter、BaseProviderMultiAdapter。
三种基础类型。
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
类型。ViewHolder
由 BaseItemProvider
实现,并且每个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;
以上是关于BaseQuickAdapter万能适配器--分类型实现多布局效果的3个适配器的主要内容,如果未能解决你的问题,请参考以下文章
Android之BaseQuickAdapter(3.0.4版本)给子view添加点击事件(helper.addOnClickListener(view))的函数没了
Android之BaseQuickAdapter(3.0.4版本)给子view添加点击事件(helper.addOnClickListener(view))的函数没了