it-swarm.com.ru

Встраивание рекламы в Recyclerview

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

Я не могу добавить его в утилитаре аналогичным образом. Любые мнения о том, как это сделать в Recyclerview?

В настоящее время в моем списке просмотра приведен следующий код для загрузки объявлений:

    if ((position % k) == 0) {
      if (convertView instanceof AdView) {
        return convertView;
      } else {
        // Create a new AdView
        AdView adView = new AdView(activity, AdSize.BANNER,
                                   ADMOB_ID);

        float density = activity.getResources().getDisplayMetrics().density;
        int height = Math.round(AdSize.BANNER.getHeight() * density);
        AbsListView.LayoutParams params = new AbsListView.LayoutParams(
            AbsListView.LayoutParams.FILL_PARENT,
            height);
        adView.setLayoutParams(params);

        adView.loadAd(new AdRequest());
        return adView;
      }
    } else {
      return delegate.getView(position - (int) Math.ceil(position / k) - 1,
          convertView, parent);
    }

Вот как это должно выглядеть:

ListView Items

Update: См. это видео от Google, оно дает полное объяснение 

33
Psypher

В вашем адаптере сначала необходимо переопределить getItemViewType, например:

@Override
public int getItemViewType(int position) 
{
    if (position % 5 == 0)
        return AD_TYPE; 
    return CONTENT_TYPE;
}

Затем в onCreateViewHolder надуйте другое представление в соответствии с типом. Что-то вроде этого:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) 
{
    View v = null;

    if (viewType == AD_TYPE)
    {
        v = new AdView(activity, AdSize.BANNER, ADMOB_ID);
        float density = activity.getResources().getDisplayMetrics().density;
        int height = Math.round(AdSize.BANNER.getHeight() * density);
        AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT,height);
        v.setLayoutParams(params);
        v.loadAd(new AdRequest());
    }
    else 
        v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_layout, viewGroup, false);

    RecyclerView.ViewHolder viewHolder = new RecyclerView.ViewHolder(v);
    return viewHolder;
}
41
Cigogne Eveillée

Как добавить элементы списка AD и не пропускать элементы содержимого и не вставлять нулевые элементы в список содержимого ?

private static final int LIST_AD_DELTA = 3;
private static final int CONTENT = 0;
private static final int AD = 1;

@Override
public int getItemViewType(int position) {
    if (position > 0 && position % LIST_AD_DELTA == 0) {
        return AD;
    }
    return CONTENT;
}

@Override
public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == CONTENT) {
        return new ContentRecyclerHolder(parent, layoutId) {
            @Override
            protected void onCardClick(CardView card) {
                fragmentManager.showPagerFragmentWithTransition(card.getContext(), getRealPosition(getAdapterPosition()));
            }
        };
    } else {
        return new AdRecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_ad, parent, false));
    }
}

@Override
public int getItemCount() {
    int additionalContent = 0;
    if (data.size() > 0 && LIST_AD_DELTA > 0 && data.size() > LIST_AD_DELTA) {
        additionalContent = data.size() / LIST_AD_DELTA;
    }
    return data.size() + additionalContent;
}

@Override
public void onBindViewHolder(BaseRecyclerHolder baseHolder, int position) {
    if (getItemViewType(position) == CONTENT) {
        ContentRecyclerHolder holder = (ContentRecyclerHolder) baseHolder;
        Content content = data.get(getRealPosition(position));
    } else {
        AdRecyclerHolder holder = (AdRecyclerHolder) baseHolder;
        holder.adView.loadAd();
    }
}

private int getRealPosition(int position) {
    if (LIST_AD_DELTA == 0) {
        return position;
    } else {
        return position - position / LIST_AD_DELTA;
    }
}
22
Volodymyr Kulyk

В вашем ArrayList добавьте нулевые значения в позиции, которые вы хотите показывать объявления

    for(int i=0;i<arr.size();i++){
       if(i%5==0)
       {
         alist.add(null);
       }
       alist.add(arr.get(i));
    }

Затем в getItemViewType (),

  @Override
public int getItemViewType(int position) {
   if(qlist.get(position)==null)
       return AD_TYPE;
   return CONTENT_TYPE;
}

Затем,

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = null;
    ViewHolder vh=null;
    if (viewType == AD_TYPE)
    {
        v=inflater.inflate(R.layout.adview_item, parent, false);
        vh=new AdviewHolder(v);

    }
    else {
        v = inflater.inflate(R.layout.cardview_items, parent, false);
        vh = new ContentViewHolder(v);
    }
    return vh;
}

Это не будет пропускать какие-либо элементы, но будет вставлять рекламу на необходимые позиции.

14
n1m1

Google предоставил код для реализации баннерной рекламы в RecycleView

Вы можете получить его из GITHUB: https://github.com/googlesamples/Android-ads/tree/master/advanced/BannerRecyclerViewExample

2
Zeeshan

Я использую модификацию с конвертером gson и мне нужно показывать рекламу после каждых 5 пунктов. Используя вышеупомянутый ответ, я получил неправильную позицию для предмета. Поэтому я вставил пользовательское значение в каждый 5-й элемент в ответе json.

call.enqueue(new Callback<List<DataModel>>() {
            @Override
            public void onResponse(Call<List<DataModel>> call, Response<List<DataModel>> response) {

                if (response.body() != null) {

                    List<DataModel> list_Data = response.body();
                    List<DataModel> list_ad_Data = new ArrayList<>();

                        for (int i = 0; i < list_Data.size(); i++) {
                            if (i %5 == 0 ){
                                list_ad_Data.add(null);
                            }
                                list_ad_Data.add(list_Data.get(i));
                        }

                        adapter = new HomeAdapter(getActivity(), list_ad_Data);

В моем адаптере. Я изменил тип представления в соответствии с 

@Override
    public int getItemViewType(int position) {
        if (list_data.get(position) == null) {
            return AD;
        }
        return CONTENT;

    }

изменение вида уже упоминалось в ответах выше. Надеюсь, это поможет будущим читателям.

1
Tejas Pandya

Загружать рекламу проще с помощью привязки данных:

@BindingAdapter({"bind:loadAds"})
public static void loadAds(AdView adView, boolean load) {
    AdRequest adRequest = new AdRequest.Builder().build();
    adView.loadAd(adRequest);
}

а затем в XML добавить это как AdView

        app:loadAds='@{true}'

как это: 

  <com.google.Android.gms.ads.AdView
        Android:id="@+id/adView"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        ads:adSize="BANNER"
        ads:adUnitId="ca-app-pub-3940256099942544/6300978111"
        app:loadAds='@{true}'
        />
0
sajad abbasi