Как внедрить нативную рекламу Admob в RecyclerView?

Я пытался следовать инструкциям из Google, но ничего не получается. У меня ошибка в моем RecyclerViewAdapter.

Ошибка выглядит следующим образом RecyclerViewAdapter. (комментарий в 9 строке)

@Override
public void onBindViewHolder(final RecyclerViewHolder holder, final int position) {

int viewType = getItemViewType(position);

switch (viewType){

    case AD_VIEW_TYPE:
        NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
        NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(Position); //Inconvertible types; cannot cast 'app.modals.cardSetterGetter' to 'com.google.android.gms.ads.NativeExpressAdView

        ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
        adCardView.removeAllViews();

        if(adView.getParent() != null){
            ((ViewGroup)adView.getParent()).removeView(adView);
        }

        adCardView.addView(adView);
        break;

    case MENU_ITEM_VIEW_TYPE:

    default:
        String card_image;
        CardSetterGetter cardSetterGetter;
        cardSetterGetter = arrayList.get(position);

        card_image = constants.SERVERIP.concat(cardSetterGetter.getImageurl());
        holder.cardSetterGetter = cardSetterGetter;
        holder.title.setText(cardSetterGetter.getImagetitle()); //set title

        cardSetterGetter.getTag();

        PointF focusPoint = new PointF(0.5f, 0f);
        // your app populates the focus point

        holder.image // set image
                .getHierarchy()
                .setActualImageFocusPoint(focusPoint);
        holder.image.setImageURI(Uri.parse(card_image));
}

}

person Ishan hrx    schedule 28.09.2017    source источник
comment
пожалуйста, добавьте свою реализацию для метода getItemViewType(position) и объявление и инициализацию для arrayList   -  person babay    schedule 30.09.2017


Ответы (1)


  1. Вы не должны добавлять просмотры в listItems. listItems содержит элементы, а не представления.

  2. NativeExpressAdViewHolder должен расширять RecyclerViewHolder.

  3. holder.getPosition() — это позиция, а не adView. Его нельзя применить к NativeExpressAdView.

  4. Если вы по-прежнему хотите сохранить adViews в списке элементов, вам следует изменить тип itemList, как это описано в примере. private final List<Object> mRecyclerViewItems;

не List<app.appname.CardSetterGetter>

person babay    schedule 28.09.2017
comment
для полного кода и учебника, которому я следовал, вы можете посмотреть мой предыдущий вопрос о той же проблеме здесь (stackoverflow.com/questions/46140421/) - person Ishan hrx; 29.09.2017
comment
ViewHolders предназначены для хранения представлений. Не лучшая идея (как я вижу) хранить представления в списке элементов. Кроме того, Admob довольно плохо закодирован, и каждый AdView создает много потоков ... Но, да, вы можете хранить свои просмотры в списке элементов ... - person babay; 29.09.2017
comment
Спасибо за ответ, ваш второй и третий пункт помогли мне решить две проблемы. Пожалуйста, уточните третью. Куда мне добавлять представления, если не в listItems. - person Ishan hrx; 29.09.2017
comment
список элементов сталкивается с той же проблемой. Должен ли я показать вам больше кода во фрагменте? - person Ishan hrx; 29.09.2017
comment
В итоге я создал объект Singletone AdKeeper, который сохраняет, загружает и перезагружает рекламу. И ViewHodler берет AdView от этого хранителя в onBindViewHolder(). А потом отпускает, когда он не нужен. Вполне себе велосипед. - person babay; 29.09.2017
comment
Да, покажите мне пожалуйста private List listItems декларацию и инициализацию. - person babay; 29.09.2017
comment
эй, я отредактировал вопрос. спасибо за решение двух проблем .. Я понимаю эту проблему, но не знаю, как ее решить. - person Ishan hrx; 29.09.2017