RecyclerView에서 광고용 레이아웃 설정

목적



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

좋은 웹페이지 즐겨찾기