wake-up-neo.net

Einbetten von Anzeigen in Recyclerview

Ich versuche, meine App von Listenansicht auf Recyclingansicht zu aktualisieren. Als ich listview verwendet habe, hatte ich eingebettete Anzeigen in der listview mit dieses Tutorial

Ich kann es nicht auf ähnliche Weise innerhalb des Recyclings hinzufügen. Gibt es irgendwelche Ansichten darüber, wie dies in einem Recyclerview zu tun ist?

Derzeit ist der Code in meiner Listenansicht wie folgt, um Anzeigen zu laden:

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

So sollte es aussehen:

ListView Items

Update: Siehe dieses Video von Google, es gibt die vollständige Erklärung 

33
Psypher

In Ihrem Adapter müssen Sie zunächst getItemViewType überschreiben. Beispiel:

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

Blasen Sie dann in onCreateViewHolder je nach Typ eine andere Ansicht auf. Etwas wie das:

@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

Wie AD-Listenelemente und hinzufügen/Inhaltselemente nicht überspringen und keine Nullelemente in die Inhaltsliste einfügen?

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

Fügen Sie in Ihrer ArrayList den Positionen, an denen Anzeigen geschaltet werden sollen, Nullwerte hinzu

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

Dann in getItemViewType (),

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

Dann,

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

Dadurch werden keine Elemente übersprungen, aber Anzeigen werden an den erforderlichen Positionen eingefügt.

14
n1m1

Google hat Code zur Implementierung von Banneranzeigen in RecycleView bereitgestellt. 

Sie können es von GITHUB erhalten: https://github.com/googlesamples/Android-ads/tree/master/advanced/BannerRecyclerViewExample

2
Zeeshan

Ich verwende das Retrofit mit dem Gson Converter und muss nach jeweils 5 Artikeln Anzeigen schalten. Da ich vor allem die Antwort verwendet habe, bekam ich eine falsche Position für den Artikel. Ich füge also jedem fünften Element in der Json-Antwort einen benutzerdefinierten Wert hinzu

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

In meinem Adapter. Ich habe den Viewtyp entsprechend geändert 

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

    }

die Änderung des Ansichtstyps wurde bereits in den obigen Antworten erwähnt. Ich hoffe, es hilft zukünftigen Lesern.

1
Tejas Pandya

Es ist einfacher, die Anzeigen über die Datenbindung wie folgt zu laden:

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

und dann in xml fügen Sie diese wie adView hinzu

        app:loadAds='@{true}'

so was: 

  <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