先看效果圖:
RecyclerView分組加載效果圖.png
在開發(fā)中,經(jīng)常會(huì)遇到分組的菜單頁面,我們可以通過在布局中自定義組合控件來實(shí)現(xiàn),這里我通過RecyclerView分組加載不同item布局來實(shí)現(xiàn)。
原理
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方法的第二個(gè)參數(shù)viewType,我們可以根據(jù)viewType的值,來加載不同的布局。
怎么獲取viewType的值,在RecyclerView.Adapter中有這樣一個(gè)方法:
@Override
public int getItemViewType(int position) {
if (itemList.get(position).getType() == ItemType.ITEM_HEADER){
return 0;
}
return 1;
}
我們需要重寫getItemViewType方法,根據(jù)自設(shè)的item類型來返回不同的值,在根據(jù)返回的viewType值來加載相對(duì)應(yīng)的item布局。
2、在Activity中
在給RecyclerView設(shè)置manager時(shí),我們?cè)O(shè)置GridLayoutManager:
GridLayoutManager manager = new GridLayoutManager(this,line_count);
line_count是設(shè)置的菜單一行顯示幾個(gè)item,我們計(jì)劃分組類別一行顯示一個(gè),manager 如下設(shè)置,根據(jù)item的類別來獲取每行顯示的數(shù)量:
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設(shè)置LayoutManager和Adapter之后就可以運(yùn)行顯示了。
注意
RecyclerView在adapter的onBindViewHolder方法中動(dòng)態(tài)設(shè)置item的高度,否則容易充滿屏幕。