OliverDamon
OliverDamon

Reputation: 147

How to put banner in recyclerview

I was able to put the banner in recylerview, but it is overlapping one of the items, it replaces one, instead of getting between them, does anyone know how to fix it?

I'm pulling an api, I do not know if that makes any difference. I searched for several tutorials, but I did not find it, what I need to do is add an admob native banner.

public class HistoricoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

List<Capitulos> capitulos;
Context context;
private static final int DEFAULT_VIEW_TYPE = 0;
private static final int NATIVE_AD_VIEW_TYPE = 1;

public HistoricoAdapter(List<Capitulos> capitulos, Context context) {
    this.capitulos = capitulos;
    this.context = context;
}

@Override
public int getItemViewType(int position) {
    if (position>1 && position % 3 == 0) {
        return NATIVE_AD_VIEW_TYPE;
    }
    return DEFAULT_VIEW_TYPE;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view;
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    switch (viewType) {
        default:
            view = layoutInflater
                    .inflate(R.layout.row_historico, parent, false);
            return new MyViewHolder(view);
        case NATIVE_AD_VIEW_TYPE:
            view = layoutInflater.inflate(R.layout.ad_unified, parent, false);
            return new NativeAdViewHolder(view);
    }
}


@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (!(holder instanceof MyViewHolder)) {
        return;
    }
    MyViewHolder holder2 = (MyViewHolder) holder;

    Capitulos l = capitulos.get(position);

    int aInt = Integer.parseInt(l.getTempo());
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(aInt * 1000L);
    String dataFormato = android.text.format.DateFormat.format("dd-MM-yyyy HH:mm:ss", cal).toString();

    SpannableString ultimoLido = new SpannableString("Último lido: " + l.getCapitulo());
    ultimoLido.setSpan(new StyleSpan(Typeface.BOLD), 0, "Último lido: ".length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    SpannableString data = new SpannableString("Data: " + dataFormato);
    data.setSpan(new StyleSpan(Typeface.BOLD), 0, "Data: ".length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    holder2.titulo.setText(l.getTitle());
    holder2.ultimoLido.setText(ultimoLido);
    holder2.data.setText(data);
    Picasso.get()
            .load("http://unionmangas.site/assets/uploads/mangas/" + l.getCapa())
            .into(holder2.capaView);

}


@Override
public int getItemCount() {
    return capitulos.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView titulo;
    TextView ultimoLido;
    TextView data;
    ImageView capaView;

    public MyViewHolder(View itemView) {
        super(itemView);

        titulo = itemView.findViewById(R.id.tituloHistoricoViewID);
        ultimoLido = itemView.findViewById(R.id.ultimosLidosViewID);
        data = itemView.findViewById(R.id.dataViewID);
        capaView = itemView.findViewById(R.id.capaHistoricoViewID);

    }

}

public class NativeAdViewHolder extends RecyclerView.ViewHolder {

    public AdView mAdView;
    public NativeAdViewHolder(View view) {
        super(view);
        mAdView = (AdView) view.findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .build();
        mAdView.loadAd(adRequest);
    }
}}

Upvotes: 0

Views: 1515

Answers (1)

Krishna Sharma
Krishna Sharma

Reputation: 2877

Edited answer to ignore the banner click event

Issue is with getItemCount. As you are adding ads in between items you also need to increase the count as well. So that the number of items not get replaced with ad item.

public static final int ITEM_PER_AD = 3;
@Override
public int getItemCount() {
    int itemCount = capitulos.size();
    itemCount += itemCount / ITEM_PER_AD ;
    return itemCount;
}

Accordingly you also need to exclude positions for ads, to get the original item position.

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (!(holder instanceof MyViewHolder)) {
        return;
    }
    int itemPosition = position - position / ITEM_PER_AD ; // need to adjust to get the list item position excluding ads
}

Below code is about to ignore click event for the ads.

@Override
public void onItemClick(View view, int position) {
      if (position>1 && position % ITEM_PER_AD == 0) { 
            return; 
      }
      // rest of the code keep as it is.
}

Upvotes: 1

Related Questions