多布局
對於多布局,提供了:
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;
}
}