如何在列表视图中添加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);
}
}
答案 0 :(得分:1)
在不知道确切错误的情况下,我认为代码可能会因为您整合广告而出现问题。
首先,你永远不会真正显示列表中的所有文章,因为你只是说每8篇文章它应该显示一个广告,但列表中的原始第8篇文章将不会显示。
现在,当您真正尝试访问其上的onBindViewHolder
,titleTxt
或desctxt
时,我认为您的示例崩溃在第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);
}