1.集成
implementation 'me.drakeet.multitype:multitype:3.3.0'
2.简单布局示例
使用MultiTypeAdapter 是没有适配器的,我们直接继承 ItemViewBinder这个类,在其中处理布局和数据的填充工作。
public class TitleViewBinder extends ItemViewBinder<Title,TitleViewBinder.TitleHolder> {
@NonNull
@Override
protected TitleHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
View view = inflater.inflate(R.layout.adapter_title, parent, false);
return new TitleHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull TitleHolder titleHolder, @NonNull Title title) {
titleHolder.textView.setText(title.title);
}
public class TitleHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public TitleHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView)itemView.findViewById(R.id.textView);
}
}
}
在使用的activity中编写代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView)this.findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mAdapter = new MultiTypeAdapter();
mAdapter.register(Title.class, new TitleViewBinder()); //注册数据
mRecyclerView.setAdapter(mAdapter);
ArrayList<Title> list = new ArrayList<>();
for (int i = 0 ; i < 10; i++){
Title title = new Title();
title.title = "xxxx="+i;
list.add(title);
}
mAdapter.setItems(list);
mAdapter.notifyDataSetChanged();
}
完成简单的使用!!!
3. 复杂的布局
public class ImageViewBinder extends ItemViewBinder<Imaeg,ImageViewBinder.ViewHolder> {
@NonNull
@Override
protected ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
View view = inflater.inflate(R.layout.adapter_image, parent, false);
return new ViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ViewHolder viewHolder, @NonNull Imaeg image) {
Glide.with(MyApplication.getInstance()).load(image.url).into(viewHolder.imageView);
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = (ImageView)itemView.findViewById(R.id.imageView);
}
}
}
public class AdViewBinder extends ItemViewBinder<Ad,AdViewBinder.ViewHolder> {
@NonNull
@Override
protected AdViewBinder.ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {
View view = inflater.inflate(R.layout.adapter_ad, parent, false);
return new ViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ViewHolder viewHolder, @NonNull Ad ad) {
Glide.with(MyApplication.getInstance()).load(ad.url).into(viewHolder.imageView);
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = (ImageView)itemView.findViewById(R.id.imageView);
}
}
}
这样我们就有了三种布局:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ArrayList<Object> list = new ArrayList<>();
for (int i = 0 ; i < 5; i++){
Title title = new Title();
title.title = "xxxx="+i;
list.add(title);
}
for (int i = 0 ; i < 2; i++){
Ad title = new Ad();
title.url = "https://www.google.com.hk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
list.add(title);
}
for (int i = 0 ; i < 6; i++){
Imaeg title = new Imaeg();
title.url = "https://www.google.com.hk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
list.add(title);
}
mRecyclerView = (RecyclerView)this.findViewById(R.id.recyclerView);
GridLayoutManager layoutManager = new GridLayoutManager(this, 10);//10=1*5*2
mRecyclerView.setLayoutManager(layoutManager);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (list.get(position) instanceof Title) {
return 10/1;//一行占1个
}
if (list.get(position) instanceof Ad) {
return 10/2;//一行占2个
}
if (list.get(position) instanceof Imaeg) {
return 10/5;//一行占5个
}
return 10;//默认一行占1个
}
});
mAdapter = new MultiTypeAdapter();
mAdapter.register(Title.class, new TitleViewBinder()); //注册数据
mAdapter.register(Ad.class, new AdViewBinder()); //注册数据
mAdapter.register(Imaeg.class, new ImageViewBinder()); //注册数据
mRecyclerView.setAdapter(mAdapter);
mAdapter.setItems(list);
mAdapter.notifyDataSetChanged();
}