java - 如何在recyclerview中放置横幅

标签 java android android-recyclerview admob

我能够将横幅放入 recylerview 中,但它与其中一项重叠,它替换了一项,而不是介于它们之间,有人知道如何修复它吗?

我正在拉取一个 api,我不知道这是否有什么区别。我找了好几个教程都没有找到,我需要做的就是添加一个admob原生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);
    }
}}

最佳答案

Edited answer to ignore the banner click event

问题出在 getItemCount 上。当您在项目之间添加广告时,您还需要增加广告数量。以便项目数量不会被广告项目替换。

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

因此,您还需要排除广告位置,以获得原始项目位置。

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

下面的代码将忽略广告的点击事件。

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

关于java - 如何在recyclerview中放置横幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52391057/

相关文章:

android - 应用程序可能在 Andriod 中的主线程(Firebase 数据库)上做了太多工作

java - SoftReference 过早地收集垃圾

java - 在溢出菜单中显示图标

java - 将鼠标坐标转换为子面板

Java: "this"关键字的问题

Android ListView 与单选模式下的 RadioButton 和自定义行布局

android - 为什么 genymotion 模拟器比 android 模拟器快很多?

android - 如何获取相机拍摄的图像的Uri并将其存储到图库

java - Android RecyclerView 内容在 notificationItemInserted 后未更新

android - 转动模拟器后布局发生变化,但不是设备