javascript - 如何在 MyAdapter 的 ListView 中添加广告

标签 javascript java android admob

如何在 ListView 中添加 AdMob 广告?

我只是添加了 MyAdapter 类和 MyViewHolder 类,但出现错误。

这是我的代码:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

/// LIST ADS
private static final int MENU_ITEM_VIEW_TYP = 0;
private static final int AD_VIEW_TYPE = 1;
/// LIST ADS

Context c;
ArrayList<Article> articles;
public MyAdapter(Context c, ArrayList<Article> articles) {
    this.c = c;
    this.articles = articles;
}

public class NativeExpressAdsViewHoolder extends MyViewHolder {
    NativeExpressAdsViewHoolder(View view){
        super(view);
    }

}

@Override
public int getItemCount() {
    return articles.size();
}
@Override
public long getItemId(int position) {
    return (position % 8 == 0) ? AD_VIEW_TYPE: position;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   switch (viewType) {
        case AD_VIEW_TYPE:
            View nativ = LayoutInflater.from(c).inflate(R.layout.native_expres_continer, parent, false);
            return new MyViewHolder(nativ);
       case MENU_ITEM_VIEW_TYP:
        default:

            View v = LayoutInflater.from(c).inflate(R.layout.model, parent, false);
            return new MyViewHolder(v);

    }


}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {

    Article article=articles.get(position);

    NativeExpressAdsViewHoolder nativeExpressHolder = (NativeExpressAdsViewHoolder)holder;
    NativeExpressAdView adsView = (NativeExpressAdView)articles.get(position);

    Article adview=articles.get(position);


    String title=article.getTitle();
    String desc=article.getDescription();
    String date=article.getDate();
   /// String imageUrl=article.getImageUrl();
    holder.titleTxt.setText(title);
    holder.desctxt.setText(desc);
    holder.dateTxt.setText(date);
   // PicassoClient.downloadImage(c,imageUrl,holder.img);
}

我的viewholder类

public class MyViewHolder extends RecyclerView.ViewHolder {
TextView titleTxt,desctxt,dateTxt,adview;
ImageView img;
public MyViewHolder(View itemView) {
    super(itemView);
    titleTxt= (TextView) itemView.findViewById(R.id.titleTxt);
    desctxt= (TextView) itemView.findViewById(R.id.descTxt);
    dateTxt= (TextView) itemView.findViewById(R.id.dateTxt);

   // img= (ImageView) itemView.findViewById(R.id.articleImage);
}

最佳答案

在不知道您得到的确切错误的情况下,我认为代码可能存在问题,因为您如何集成广告。

首先,您永远不会实际显示列表中的所有文章,因为您只是说每第 8 篇文章应该显示一个广告,但不会显示列表中原始的第 8 篇文章。

现在我认为当您实际尝试访问 titleTxtdesctxt 时,您的示例在第 8 个元素的 onBindViewHolder 中崩溃>dateTxt 就可以了。您膨胀的 ViewHolder 是一个 NativeExpressAdsViewHolder(因为它也是 RecyclerView.ViewHolder 类型 <- 顺便说一句,您可以保留整个检查。holder onBindViewHolder 将始终是一个 ViewHolder),因此它不会有这些字段并且程序会崩溃。

为了使其正常工作,您需要在提供给适配器的后备集合中对可用广告进行表示。

因此,我不会为您的 Adapter 提供文章列表,而是引入这样的界面:

interface ListElement {

    ElementType getType();

    enum ElementType {
        ARTICLE,
        AD
    }
}

当然现在您的 Article 类将需要实现此接口(interface)并始终在 getType 方法中静态返回 ElementType.ARTICLE 并且您需要一个空类 Ad,它也实现了该接口(interface)并始终在其 getType 方法中返回 ElementType.AD

现在我假设您从 Web 的某处加载您的文章,然后将它们传递给适配器?因此,现在在将它们传递给适配器之前,您需要插入 Ad 占位符类。所以无论你在哪里实例化你的适配器,都要做这样的事情:

private MyAdapter createAdapter(List<Article> articlesLoadedFromWeb) {
    final List<ListElement> articlesAndAds = new ArrayList<>();

    for (int i = 0; i < articlesLoadedFromWeb.size(); i++) {
        if (i % 8 == 0) {
            articlesAndAds.add(new Ad());
        } else {
            articlesAndAds.add(articlesLoadedFromWeb(i));
        }
    }

    return new MyAdapter(getContext(), articlesAndAds);
}

然后你的 Adapter 看起来像这样:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {


    final Context c;
    final List<ListElement> articlesAndAds;

    public MyAdapter(Context c, List<ListElement> articlesAndAds) {
        this.c = c;
        this.articlesAndAds = articlesAndAds;
    }

    public class NativeExpressAdsViewHolder extends MyViewHolder {
        NativeExpressAdsViewHolder(View view){
            super(view);
        }

    }

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

    @Override
    public long getItemId(int position) {
        return articlesAndAds.get(position).getType().ordinal();
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       switch (viewType) {
            case ListElement.ElementType.AD.ordinal():
                View nativ = LayoutInflater.from(c).inflate(R.layout.native_express_container, parent, false);
                return new MyViewHolder(nativ);
           case ListElement.ElementType.ARTICLE.ordinal():
           default:

                View v = LayoutInflater.from(c).inflate(R.layout.model, parent, false);
                return new MyViewHolder(v);

        }

    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

        if (articlesAndAds.get(position).getType() == ListElement.ElementType.ARTICLE) {
            final Article article = (Article) articles.get(position);

            String title = article.getTitle();
            String desc = article.getDescription();
            String date = article.getDate();
            /// String imageUrl = article.getImageUrl();
            holder.titleTxt.setText(title);
            holder.desctxt.setText(desc);
            holder.dateTxt.setText(date);
            // PicassoClient.downloadImage(c, imageUrl, holder.img);
        }
    }

}

关于javascript - 如何在 MyAdapter 的 ListView 中添加广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45801104/

相关文章:

java - 如何在 Java 中将 DataFrame 转换为 Apache Spark 中的数据集?

java - Android 版 Google map 的生产 API key

java - getSupportFragmentManager 错误

javascript - 仅在首次加载时使用 nuxt.js 设置数据

javascript - 获取多个可拖动对象的坐标

Python 中的 JavaBean 等价物

java - 如何在准备好的语句查询中使用oracle SYSTIMESTAMP?

android - Lollipop 中的 SwitchPreference 回调行为更改

javascript - 如何在 JQuery DataTable 中单击按钮时显示警报?

JavaScript 图像不会显示