如何在 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 篇文章。
现在我认为当您实际尝试访问 titleTxt
、desctxt
或 时,您的示例在第 8 个元素的
就可以了。您膨胀的 ViewHolder 是一个 onBindViewHolder
中崩溃>dateTxtNativeExpressAdsViewHolder
(因为它也是 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/