如何在MyAdapter的listview中添加广告

时间:2017-08-21 15:43:02

标签: javascript java android admob

如何在列表视图中添加AdMob广告?

我只是添加了With hardcoding of number of fields. awk -v RS='[ \n]' '{ORS=NR%3==0?"\n":" ";print $0+1}' Input_file OR Without hardcoding number of fields. awk -v RS='[ \n]' -v col=$(awk 'FNR==1{print NF}' Input_file) '{ORS=NR%col==0?"\n":" ";print $0+1}' Input_file 类和MyViewHolder类,但是我收到了错误。

这是我的代码:

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

}

1 个答案:

答案 0 :(得分:1)

在不知道确切错误的情况下,我认为代码可能会因为您整合广告而出现问题。

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

现在,当您真正尝试访问其上的onBindViewHoldertitleTxtdesctxt时,我认为您的示例崩溃在第8个元素的dateTxt中。你夸大的ViewHolder是NativeExpressAdsViewHoolder(因为它也是类型RecyclerView.ViewHolder&lt; - 顺便说一句,你可以完全检查。holder的{​​{1}}将始终是onBindViewHolder {1}})所以它不会有那些字段,程序会崩溃。

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

因此,我不会给你的适配器提供一个文章列表,而是会引入这样的界面:

ViewHolder

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

现在我假设您从Web上的某处加载文章,然后将它们传递给适配器?所以现在在将它们传递给适配器之前,您需要插入getType占位符类。因此,如果您实现适配器,请执行以下操作:

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