目的
RecyclerView内に広告(バナー広告を想定)を掲載する際、広告用のレイアウトを設定する方法がLayoutManagerによって異なったため、それぞれのLayoutManagerでの設定方法のメモ
前提
RecyclerView.AdapterのgetItemCountは広告の枠も含めた件数を返し、getItemViewTypeで該当する位置が通常のアイテムか広告か判断出来るようになっているものとします。
LinearLayoutManager
AdapterのonCreateViewHolderとonBindViewHolderでViewTypeごとの処理に振り分けるだけ。
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_ADS) {
// 広告用のViewHolderを返す
} else {
// 通常のViewHolderを返す
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (getItemViewType(position) == ITEM_TYPE_ADS) {
// 広告の表示
} else {
// 通常の処理
}
}
GridLayoutManager
LinearLayoutManagerでの処理に追加で、GridLayoutManagerにSpanSizeLookupを設定し、位置が広告の場合、アイテムがグリッドと同じスパンを占めることを返すようにする。
int colCount = 3;
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), colCount, GridLayoutManager.VERTICAL, false);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (getItemViewType(position) == ITEM_TYPE_ADS){
return colCount;
} else {
return 1;
}
}
});
StaggeredGridLayoutManager
LinearLayoutManagerでの処理に追加で、onBindViewHolderで位置が広告の場合、ViewHolderのLayoutParamsのsetFullSpanにtrueを設定する。
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (getItemViewType(position) == ITEM_TYPE_ADS) {
((StaggeredGridLayoutManager.LayoutParams)holder.itemView.getLayoutParams()).setFullSpan(true);
// 広告の表示
} else {
// 通常の処理
}
}