这里是我写的一种常规实现,思路清晰易懂。开始接触这类需求的时候我都是这么写的,适合于新手使用。有助于帮助使用者形成思路,并实现需求。下面我给出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);
}
}
}
网友评论