web-dev-qa-db-fra.com

Intégration d'annonces dans Recyclerview

J'essaie de mettre à niveau mon application de listview à recyclerview. Lorsque j'utilisais Listview, j'avais intégré des annonces dans Listview en utilisant ce tutoriel } _. 

Je ne peux pas l'ajouter de la même manière dans recyclerview. Des points de vue sur la façon dont cela doit être fait dans Recyclerview?

Actuellement dans ma liste, le code est le suivant pour le chargement des annonces:

    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);
    }

Voici à quoi cela devrait ressembler:

ListView Items

Mise à jour: Reportez-vous cette vidéo à partir de Google, cela donne l'explication complète 

33
Psypher

Dans votre adaptateur, vous devez d’abord remplacer getItemViewType, par exemple:

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

Ensuite, dans onCreateViewHolder, gonflez une vue différente en fonction du type. Quelque chose comme ça:

@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

Comment ajouter des éléments de liste AD et ne pas ignorer les éléments de contenu et ne pas insérer d'éléments nuls dans la liste de contenu?

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

Dans votre ArrayList, ajoutez des valeurs null aux positions pour lesquelles vous souhaitez diffuser des annonces.

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

Puis dans getItemViewType (),

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

Ensuite,

@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;
}

Cela ne sautera aucun élément, mais insérera des annonces aux postes requis.

14
n1m1

Google a fourni le code permettant d'implémenter une bannière publicitaire dans RecycleView

Vous pouvez l'obtenir auprès de GITHUB: https://github.com/googlesamples/Android-ads/tree/master/advanced/BannerRecyclerViewExample

2
Zeeshan

J'utilise retrofit avec gson converter et je dois afficher des annonces tous les 5 articles. En utilisant avant tout réponse, je me suis trompé de position pour le produit. J'ai donc inséré une valeur personnalisée à chaque cinquième élément de la réponse 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);

Dans mon adaptateur. J'ai changé de type de vue en fonction de 

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

    }

le changement de type de vue est déjà mentionné dans les réponses ci-dessus. J'espère que cela aidera les futurs lecteurs.

1
Tejas Pandya

Il est plus facile de charger les annonces via la liaison de données comme ceci:

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

puis en XML ajouter ceci comme adView

        app:loadAds='@{true}'

comme ça: 

  <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