如何在RecyclerView PagedListAdapter中的特定位置添加Admob?

时间:2018-09-07 06:50:33

标签: android android-recyclerview admob

我正在尝试在RecyclerView(即PagedListAdapter)的特定位置展示Admob标语广告。在我当前的实现中,我能够将视图(包含广告)添加到特定位置,但是它将实际的ViewHolder替换为AdView。

问题出在我无法提供逻辑的getItemCountgetItemViewType上。

任何人都可以展示如何做到吗?

我正在发布一个简单的案例示例。

public class MessageAdapter extends PagedListAdapter<Message, RecyclerView.ViewHolder> {

    private static final int ITEM_VIEW = R.layout.list_message;
    private static final int AD_VIEW = R.layout.list_ad;

    public MessageAdapter() {
        super(Message.DIFF_UTIL);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view;
        switch (viewType) {
            case ITEM_VIEW:
                view = inflater.inflate(ITEM_VIEW, parent, false);
                return new MessageViewHolder(view, mListener);
            case AD_VIEW:
                view = inflater.inflate(AD_VIEW, parent, false);
                return new AdViewHolder(view);
            default:
                throw new IllegalArgumentException("Unknown Holder type");
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case ITEM_VIEW:
                Message message = getItem(position);
                ((MessageViewHolder) holder).bindTo(message.getId(), message.getTitle());
                break;
            case AD_VIEW:
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return (position % 10 == 0) ? AD_VIEW : ITEM_VIEW;
    }

    @Override
    public int getItemCount() {
        return super.getItemCount();
    }


    static class AdViewHolder extends RecyclerView.ViewHolder {

        private AdView mAdView;

        AdViewHolder(View itemView) {
            super(itemView);
    //        mAdView = itemView.findViewById(R.id.adView);
    //        AdRequest adRequest = new AdRequest.Builder().build();
    //        mAdView.loadAd(adRequest);
        }
    }
}

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

对于您唯一的问题是getItemCount(),因为我认为super.getItemCount();返回消息的数量,但是您想显示每10个项目加一次,因此总大小是消息的数量加消息的数量。显示的广告。

您应该尝试类似

@Override
public int getItemCount() {
    return super.getItemCount() //Number of messages 
           + ((int) super.getItemCount() / 10) + 1 ; // Number of ads displayed the plus 1 is for the first element which will be an Ad
}

答案 1 :(得分:0)

有点晚了,但是当我看到那个帖子时,其他人很有可能会这么做。

这可以帮助您:

public static final int ADS_AFTER = 10;
@Override
public int getItemCount() {
    int s = super.getItemCount();
    int t  = s + (s / ADS_AFTER);
    if(s>0) t++; // +1 when list is not empty
    Log.e("☺☺☺ total is "+t+", real are "+s);
    return t;
}