Как добавить Admob на определенных позициях в RecyclerView PagedListAdapter? - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь показывать рекламные баннеры Admob в определенной позиции в RecyclerView, который представляет собой PagedListAdapter. С моей текущей реализацией я могу добавить виды (которые содержат рекламу) к определенной позиции, но он заменяет фактический ViewHolder на AdView.

Проблема с getItemCount и getItemViewType, где я не могу предоставить логику.

Может кто-нибудь показать, как это можно сделать?

Я публикую простой пример кейса.

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 голосов
/ 30 декабря 2018

Немного поздно, но когда я наткнулся на этот пост, есть вероятность, что другие это сделают.

Это может помочь вам:

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;
}
0 голосов
/ 07 сентября 2018

Единственной проблемой, с которой вы столкнулись, является 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
}
...