写这篇文章的由衷是在项目里面遇到了这样的一个问题,使用recycleView,列表样式使用GridLayoutManager设置,再此基础上添加头部,如果只是一味的往下写,当做LinearLayoutManager来做,那么列表显示就有问题了,我的列表数据是五条
for (int i = 0; i < 5; i++) {
SpecialDetailBean bean = new SpecialDetailBean();
bean.setTitle("凯迪拉克");
list.add(bean);
}
数据绑定
GridLayoutManager mLayoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(mLayoutManager);
adapter = new SaleCarAdapter(this);
recyclerView.setAdapter(adapter);
看图来了,看下图
第一张图我是要铺满上面的,这不是我想要的效果,查了一番,原来GridLayoutManager有这样一个函数setSpanSizeLookup(),重写getSpanSize(int position),根据源码的说明,他是返回adapter中每个item应该占有的位置,加上这个函数
GridLayoutManager mLayoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(mLayoutManager);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch (adapter.getItemViewType(position)) {
case SaleCarAdapter.TYPE_NORMAL:
return 1;//返回顶部一条数据
default:
return 2;//返回列表
}
}
});
adapter = new SaleCarAdapter(this);
recyclerView.setAdapter(adapter);
正确的样式
adapter的代码
public static final int TYPE_HEAD = 100;
public static final int TYPE_NORMAL = 108;
private Context mContext;
private List<SpecialDetailBean> bean = null;
public SaleCarAdapter(Context context) {
mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEAD) {
final View view = LayoutInflater.from(mContext).inflate(R.layout.item_sale_head, parent, false);
return new ItemViewHeadHolder(view);
} else {
final View view = LayoutInflater.from(mContext).inflate(R.layout.item_sale_layout, parent, false);
return new ItemViewHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
ItemViewHolder item = (ItemViewHolder) holder;
if (bean != null) {
item.tvCarDesc.setText(bean.get(position - 1).getTitle());
}
} else {
}
}
public void setBean(List<SpecialDetailBean> mBean) {
bean = mBean;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEAD;
} else {
return TYPE_NORMAL;
}
}
@Override
public int getItemCount() {
if (bean != null) {
return 1 + bean.size();
} else {
return 1;
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.iv_car)
ImageView ivCar;
@BindView(R.id.tv_car_desc)
TextView tvCarDesc;
@BindView(R.id.tv_start_price)
TextView tvStartPrice;
@BindView(R.id.tv_discount)
TextView tvDiscount;
@BindView(R.id.tv_guidence_price)
TextView tvGuidencePrice;
public ItemViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
public class ItemViewHeadHolder extends RecyclerView.ViewHolder {
@BindView(R.id.iv_sale)
ImageView ivSale;
public ItemViewHeadHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
ok,成功搞定。