美文网首页
RecyclerView实现多布局

RecyclerView实现多布局

作者: bruce1990 | 来源:发表于2018-02-09 17:30 被阅读0次

这里是我写的一种常规实现,思路清晰易懂。开始接触这类需求的时候我都是这么写的,适合于新手使用。有助于帮助使用者形成思路,并实现需求。下面我给出Adapter的实现

/**

  • 创建时间:2018/1/22
  • 创建人: liuzj
  • 描述:
  • 包名:com.androidquanjiakan.adapter
  • 邮箱:liuzj@hi-board.com
    */

public class ShoppingMallAdapter extends RecyclerView.Adapter {

private List<String> bannerList;  //轮播图数据源
private List<String> recommendList;  //推荐图数据源
private List<GoodsBean> shoppingList;  //商品数据源

private static final int TYPE_BANNER = 0;
private static final int TYPE_RECOMMEND = 1;
private static final int TYPE_TITLE = 2;
private static final int TYPE_NORMAL = 3;
private final LayoutInflater inflater;
private Context mContext;


public ShoppingMallAdapter(Context mContext) {
    this.mContext = mContext;
    inflater = LayoutInflater.from(mContext);
    if (bannerList == null) {
        bannerList = new ArrayList<>();
    }
    if (recommendList == null) {
        recommendList = new ArrayList<>();
    }

    if (shoppingList == null) {
        shoppingList = new ArrayList<>();
    }
}

public void setBannerList(List<String> bannerList) {
    this.bannerList = bannerList;
    notifyDataSetChanged();
}

public void setShoppingList(List<GoodsBean> shoppingList) {
    this.shoppingList = shoppingList;
    notifyDataSetChanged();
}

public void setRecommendList(List<String> recommendList) {
    this.recommendList = recommendList;
    notifyDataSetChanged();
}


@Override
public int getItemCount() {
    return 2 + shoppingList.size() + recommendList.size();
}

/**
 * @param position
 * @return 根据position位置设置不同视图类型
 */
@Override
public int getItemViewType(int position) {
    /*
    * 计算每一个位置对应的item类型
    * */
    if (position == 0) {
        return TYPE_BANNER;
    } else if (position >= 1 && position <= recommendList.size()) {
        return TYPE_RECOMMEND;
    } else if (position == recommendList.size() + 1) {
        return TYPE_TITLE;
    } else if (position >= (recommendList.size() + 2) && position < (2 + shoppingList.size() + recommendList.size())) {
        return TYPE_NORMAL;
    }
    return super.getItemViewType(position);
}

/**
 * @param parent
 * @param viewType
 * @return 根据viewType设置不同的布局  从而实现多布局
 */
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    /*
    * 根据不同的类型加载对应的布局
    *
    * */
    switch (viewType) {
        case TYPE_BANNER:
            View banner = inflater.inflate(R.layout.item_shopping_banner, parent, false);
            return new BannerHolder(banner);

        case TYPE_RECOMMEND:
            View recommend = inflater.inflate(R.layout.item_shopping_recommend, parent, false);
            return new RecommendHolder(recommend);

        case TYPE_TITLE:
            View title = inflater.inflate(R.layout.item_shopping_title, parent, false);
            return new TitleHolder(title);

        case TYPE_NORMAL:
            View normal = inflater.inflate(R.layout.item_shopping_normal, parent, false);
            return new NormalHolder(normal);
        default:
            return null;
    }

}

/**
 * @param holder
 * @param position 根据holder设置不同的数据
 */
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof BannerHolder) {
        setBannerData((BannerHolder) holder);
    } else if (holder instanceof RecommendHolder) {
        setRecommendData((RecommendHolder) holder, position);
    }else if (holder instanceof TitleHolder) {

    }else if (holder instanceof NormalHolder) {
        setNormalData((NormalHolder) holder, position);
    }


}

/**
 * @param holder 普通数据
 */
private void setNormalData(NormalHolder holder, int position) {
    int i = position - recommendList.size() - 2;
    if (shoppingList.get(i).getName() != null) {
        holder.goodsName.setText(shoppingList.get(i).getName());
    }
    if (shoppingList.get(i).getPrice() != null) {
        holder.goodsPrice.setText("¥" + shoppingList.get(i).getPrice());
    }

    if (shoppingList.get(i).getUrl() != null) {
        Picasso.with(mContext).load(shoppingList.get(i).getUrl()).into(holder.goodsImage);
    }


}

/**
 * @param holder 推荐设备
 */
private void setRecommendData(RecommendHolder holder, int position) {
    if (recommendList.get(position - 1) != null) {
        Picasso.with(mContext).load(recommendList.get(position - 1)).into(holder.ivRecommend);
    }

}

/**
 * @param holder 轮播图
 */
private void setBannerData(BannerHolder holder) {
    BaseBannerViewPagerAdapter<String> bannerViewPagerAdapter = new BaseBannerViewPagerAdapter<String>(mContext, new BaseBannerViewPagerAdapter.OnAutoViewPagerItemClickListener() {
        @Override
        public void onItemClick(int position, Object o) {

        }
    }) {
        @Override
        public void loadImage(ImageView view, int position, String s) {
            Picasso.with(mContext).load(s).into(view);
        }

        @Override
        public void setSubTitle(TextView textView, int position, String s) {

        }
    };
    holder.banner.setAdapter(bannerViewPagerAdapter);
    bannerViewPagerAdapter.add(bannerList);
}

/**
 * @param recyclerView 重写onAttachedToRecyclerView使GridLayout可以呈现多种布局,单个item,多个item
 */
@Override
public void onAttachedToRecyclerView(final RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

    if (layoutManager instanceof GridLayoutManager) {
        GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
        /*
        * setSpanSizeLookup 的返回值可以设置列数
        * 列数 = 原始设置值/当前设置值  比如我们设置的是3那么我们这里返回3,对应的就是列数1
        * */
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {

                int itemViewType = getItemViewType(position);  //根据每个位置对应的类型,我们来分配
                switch (itemViewType) {
                    case TYPE_BANNER:
                        return 3;
                    case TYPE_RECOMMEND:
                        return 1;
                    case TYPE_TITLE:
                        return 3;
                    case TYPE_NORMAL:
                        return 3;
                    default:
                        return 3;
                }
            }
        });
    }
}

static class BannerHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.banner)
    BannerPage banner;

    public BannerHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}

static class RecommendHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.iv_recommend)
    ImageView ivRecommend;

    public RecommendHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}

static class TitleHolder extends RecyclerView.ViewHolder {

    public TitleHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}

static class NormalHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.goods_image)
    ImageView goodsImage;
    @BindView(R.id.goods_name)
    TextView goodsName;
    @BindView(R.id.goods_price)
    TextView goodsPrice;

    public NormalHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}

}

相关文章

网友评论

      本文标题:RecyclerView实现多布局

      本文链接:https://www.haomeiwen.com/subject/wacqtftx.html