Android:RecyclerView 实现多类型列表
在 APP 中,通常会有列表中包含了 Banner、广告、图片内容、新闻等多种内容,这样就让 APP 看起来内容更加丰富。在 Android 中通常使用 RecyclerView 就可以用轻松实现,其主要是通过 ViewType 来进行区分列表项的类型的。
通常只需要根据 ViewType 来处理。在 onCreateViewHolder() 中根据 viewType 参数,也就是 getItemViewType() 的返回值来判断需要创建的 ViewHolder 类型,然后在 onBindViewHolder() 方法中对 ViewHolder 的具体类型进行判断,分别为不同类型的 ViewHolder 进行绑定数据与逻辑处理
代码如下所示:
public class HomePageAdapter extends RecyclerView.Adapter {
public static final int TYPE_BANNER = 0;
public static final int TYPE_AD = 1;
public static final int TYPE_TEXT = 2;
public static final int TYPE_IMAGE = 3;
public static final int TYPE_NEW = 4;
private List<HomePageEntry> mData;
public void setData(List<HomePageEntry> data) {
mData = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case TYPE_BANNER:
return new BannerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_banner_layout,null));
case TYPE_AD:
return new BannerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_ad_item_layout,null));
case TYPE_TEXT:
return new BannerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_text_item_layout,null));
case TYPE_IMAGE:
return new BannerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_image_item_layout,null));
case TYPE_NEW:
return new BannerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.home_news_item_layout,null));
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int type = getItemViewType(position);
switch (type){
case TYPE_BANNER:
// banner 逻辑处理
break;
case TYPE_AD:
// 广告逻辑处理
break;
case TYPE_TEXT:
// 文本逻辑处理
break;
case TYPE_IMAGE:
//图片逻辑处理
break;
case TYPE_NEW:
//视频逻辑处理
break;
// ... 此处省去N行代码
}
}
@Override
public int getItemViewType(int position) {
if(position == 0){
return TYPE_BANNER;//banner在开头
}else {
return mData.get(position).type;//type 的值为TYPE_AD,TYPE_IMAGE,TYPE_AD,等其中一个
}
}
@Override
public int getItemCount() {
return mData == null ? 0:mData.size();
}
public static class BannerViewHolder extends RecyclerView.ViewHolder{
public BannerViewHolder(View itemView) {
super(itemView);
//绑定控件
}
}
public static class NewViewHolder extends RecyclerView.ViewHolder{
public VideoViewHolder(View itemView) {
super(itemView);
//绑定控件
}
}
public static class AdViewHolder extends RecyclerView.ViewHolder{
public AdViewHolder(View itemView) {
super(itemView);
//绑定控件
}
}
public static class TextViewHolder extends RecyclerView.ViewHolder{
public TextViewHolder(View itemView) {
super(itemView);
//绑定控件
}
}
public static class ImageViewHolder extends RecyclerView.ViewHolder{
public ImageViewHolder(View itemView) {
super(itemView);
//绑定控件
}
}
}