1
1

More than 3 years have passed since last update.

RecyclerViewで広告用のレイアウトを設定する

Posted at

目的

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 {
        // 通常の処理
    }
}

linear.png

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;
        }
    }
});

grid.png

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 {
        // 通常の処理
    }
}

staggered.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1