在 ListView 中显示重复布局的 Facebook 原生横幅广告

Posted

技术标签:

【中文标题】在 ListView 中显示重复布局的 Facebook 原生横幅广告【英文标题】:Facebook Native banner ads displaying duplicate layout in ListView 【发布时间】:2019-07-08 11:13:17 【问题描述】:

我正在我的ListView 中实施 Facebook 原生横幅广告。广告工作正常,但广告的空白布局也显示在广告上方。

下面是我ListView的适配器代码:

public CouponsViewAdapter(Context context, List<DataSetForCoupons> 
couponsdata, String amount_value, String id, String value, 
List<DataSetForAddCoupons> addcouponsdata, boolean saving) 
    this.context = context;
    this.DataList = couponsdata;
    this.DataListAdd = addcouponsdata;
    this.amount = amount_value;
    this.id = id;
    this.value = value;
    this.saving = saving;
    for (int i = 0; i < DataList.size(); i++) 
        if (i % 2 == 0 && i != 0) 
            itemType.add(i, 1);
            DataList.add(i, null);
         else
            itemType.add(i, 0);
    


@Override
public int getCount() 
    return DataList.size();


@Override
public Object getItem(int position) 
    return position;


@Override
public long getItemId(int position) 
    return position;


@Override
public int getItemViewType(int position) 
    if (itemType.get(position) == 1)
        return SECOND_ITEM;
    else
        return FIRST_ITEM;


@Override
public int getViewTypeCount() 
    return 2;

@Override
public View getView(final int position, View convertView, ViewGroup parent) 
    int type = getItemViewType(position);

    if (convertView == null) 
    final LayoutInflater Inflater = (LayoutInflater) context.getSystemService(
                Activity.LAYOUT_INFLATER_SERVICE);

    switch (type) 
    case SECOND_ITEM:             
    nativeBannerAd = new NativeBannerAd(context, "IMG_16_9_APP_INSTALL#635165165156968704093");

    convertView = Inflater.inflate(R.layout.banner_ad, null, false);
    nativeBannerAdContainer = convertView.findViewById(R.id.banner_ad_layout);

    nativeBannerAd.setAdListener(new NativeAdListener() 
        @Override
        public void onAdLoaded(Ad ad) 
            if (nativeBannerAd == null || nativeBannerAd != ad) 
                return;
            
            nativeBannerAd.unregisterView();

            adView = (LinearLayout) Inflater.inflate(R.layout.banner_ad, 
            nativeBannerAdContainer, false);
            nativeBannerAdContainer.addView(adView);

            RelativeLayout adChoicesContainer = adView.findViewById(R.id.ad_choices_container);
            AdChoicesView adChoicesView = new AdChoicesView(context, nativeBannerAd, true);
            adChoicesContainer.addView(adChoicesView, 0);

            AdIconView nativeAdIconView = adView.findViewById(R.id.native_icon_view);
            Button nativeAdCallToAction = adView.findViewById(R.id.native_ad_call_to_action);

            List<View> clickableViews = new ArrayList<>();
            clickableViews.add(nativeAdTitle);
            clickableViews.add(nativeAdCallToAction);
            nativeBannerAd.registerViewForInteraction(adView, nativeAdIconView, clickableViews);
        
        @Override
        public void onAdClicked(Ad ad) 
        
        @Override
        public void onLoggingImpression(Ad ad) 
        
    );
    nativeBannerAd.loadAd();
    break;
    case FIRST_ITEM:
        //Implementing the ListView here
    break;  
    return convertView;

我尝试使用convertView 而不是adView,但它在运行时会产生错误。

这是截图

【问题讨论】:

显示完整的适配器代码 更新了代码。 case FIRST_ITEM 代码很大,所以我把它省略了。 【参考方案1】:

在添加新视图之前您需要从现有视图中删除以前添加的视图,这不会导致重复视图 nativeBannerAdContainer.removeAllViews(); // 在添加新视图之前添加这行代码 nativeBannerAdContainer.addView(adView); //

如果您删除 removeAllViews,这将删除以前添加的所有视图,并且您的视图永远不会被复制

 nativeBannerAd.setAdListener(new NativeAdListener() 
        @Override
        public void onAdLoaded(Ad ad) 
            if (nativeBannerAd == null || nativeBannerAd != ad) 
                return;
            
            nativeBannerAd.unregisterView();

            adView = (LinearLayout) Inflater.inflate(R.layout.banner_ad, 
            nativeBannerAdContainer, false);
            nativeBannerAdContainer.removeAllViews();
            nativeBannerAdContainer.addView(adView);

            RelativeLayout adChoicesContainer = adView.findViewById(R.id.ad_choices_container);
            AdChoicesView adChoicesView = new AdChoicesView(context, nativeBannerAd, true);
            adChoicesContainer.addView(adChoicesView, 0);

            AdIconView nativeAdIconView = adView.findViewById(R.id.native_icon_view);
            Button nativeAdCallToAction = adView.findViewById(R.id.native_ad_call_to_action);

            List<View> clickableViews = new ArrayList<>();
            clickableViews.add(nativeAdTitle);
            clickableViews.add(nativeAdCallToAction);
            nativeBannerAd.registerViewForInteraction(adView, nativeAdIconView, clickableViews);
        
        @Override
        public void onAdClicked(Ad ad) 
        
        @Override
        public void onLoggingImpression(Ad ad) 
        
    );

【讨论】:

谢谢,伙计。像魅力一样工作。但它在消失之前显示了一段时间。知道如何解决吗? 您可以在最初隐藏 adView 可见性 GONE,并在 nativeBannerAd.registerViewForInteraction 之后可见。

以上是关于在 ListView 中显示重复布局的 Facebook 原生横幅广告的主要内容,如果未能解决你的问题,请参考以下文章

删除 ListView 分隔符(在 xml 布局文件中)[重复]

在检测到更改时刷新 ListView [重复]

无法在 ListView 中使用自定义项目布局正确显示图像

ListView填充父,屏幕或任何[重复]的宽度

ListView中动态显示隐藏HeaderView和FooterView

浅谈ListView滑动隐藏显示ToolBar