先看效果图:
在开发中,经常会遇到分组的菜单页面,我们可以通过在布局中自定义组合控件来实现,这里我通过RecyclerView分组加载不同item布局来实现。
原理
1、在adapter中
我们先看在Adapter中加载item布局的方法:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView;
if (viewType == 0){
itemView = mInflater.inflate(R.layout.item_group_header,parent,false);
}else {
itemView = mInflater.inflate(R.layout.item_group_normal,parent,false);
}
return new ViewHolder(itemView);}
onCreateViewHolder方法的第二个参数viewType,我们可以根据viewType的值,来加载不同的布局。
怎么获取viewType的值,在RecyclerView.Adapter中有这样一个方法:
@Override
public int getItemViewType(int position) {
if (itemList.get(position).getType() == ItemType.ITEM_HEADER){
return 0;
}
return 1;
}
我们需要重写getItemViewType方法,根据自设的item类型来返回不同的值,在根据返回的viewType值来加载相对应的item布局。
2、在Activity中
在给RecyclerView设置manager时,我们设置GridLayoutManager:
GridLayoutManager manager = new GridLayoutManager(this,line_count);
line_count是设置的菜单一行显示几个item,我们计划分组类别一行显示一个,manager 如下设置,根据item的类别来获取每行显示的数量:
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch (itemList.get(position).getType()){
case ITEM_HEADER:
return line_count;
case ITEM_NORMAL:
return 1;
}
return 0;
}
});
给RecyclerView设置LayoutManager和Adapter之后就可以运行显示了。
注意
RecyclerView在adapter的onBindViewHolder方法中动态设置item的高度,否则容易充满屏幕。