GridView 中的 Facebook 原生广告:MediaView 显示灰色矩形

Posted

技术标签:

【中文标题】GridView 中的 Facebook 原生广告:MediaView 显示灰色矩形【英文标题】:Facebook native ads in GridView : MediaView displays a grey rectangle 【发布时间】:2016-07-21 13:36:55 【问题描述】:

我将 Facebook 原生广告集成到 GridView 中。现在,我展示测试广告。除了播放视频之外,它工作正常。

如果用户不与 GridView 交互,MediaView 可以正常播放视频。 当 GridView 正在滚动时,视频会暂停并在广告重新出现在屏幕上时恢复。

上下滚动网格数次后,MediaView 不再显示视频,只是显示一个灰色矩形。

出于好奇,当 MediaView 为灰色时,我尝试在我的设备上运行 Ui Automatic Viewer。我注意到一些有趣的事情,但我无法真正理解。

在视图层次结构中,我可以看到带有一些子框架布局(适配器提供的视图的容器)的 GridView。这包括原生广告和其他视图。

但是当MediaView为灰色时,它的FrameLayout不出现在View层级中!但它在屏幕上渲染得很好!

我对我所看到的感到非常困惑。

另外,当我将这些广告集成到 RecyclerView 中时,我没有遇到这个问题(或者至少没有注意到)。

让我们谈谈代码。我有一个指向 Facebook 原生广告视图的参考。

欢迎提出建议:)

这是向 GridView 提供视图的适配器的代码:

public class AdapterGridGallery extends BaseAdapter implements AdListener 

    private static int POSITION_AD = 4;
    private List<QuizzModel> listQuizzes;

    int heightViews;
    FragmentGallery fragmentGallery;

    View facebookAdView;
    private NativeAd facebookNativeAd;
    private boolean nativeAdSet = false;

    public AdapterGridGallery(FragmentGallery fragment, int height) 
        heightViews = height;
        fragmentGallery = fragment;
        facebookNativeAd = new NativeAd(fragment.getContext(), "my_tag");
        facebookNativeAd.setAdListener(this);
        facebookNativeAd.loadAd();
    

    public void updateData(List<QuizzModel> list) 
        listQuizzes = list;
        notifyDataSetChanged();
    

    @Override
    public int getCount() 
        return listQuizzes != null ? listQuizzes.size() + 1 : 0;
    

    @Override
    public Object getItem(int i) 
        return listQuizzes.get(i);
    

    @Override
    public long getItemId(int i) 
        return listQuizzes.get(i).getId();
    

    @Override
    public int getItemViewType(int position) 
        if (position == POSITION_AD)
            return 0;
        else
            return 1;
    

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) 
        View viewQuizz = null;
        switch (getItemViewType(position)) 
            case 0:
                if (facebookAdView == null) 
                    facebookAdView = LayoutInflater.from(viewGroup.getContext())
                            .inflate(R.layout.view_facebook_native, viewGroup, false);
                    //Settings the height of the view
                    AbsListView.LayoutParams params = (AbsListView.LayoutParams) facebookAdView.getLayoutParams();
                    params.height = heightViews;
                    params.width = AbsListView.LayoutParams.MATCH_PARENT;
                    facebookAdView.setLayoutParams(params);
                

                viewQuizz = facebookAdView;
                viewQuizz.setTag(0);

                if (facebookNativeAd.isAdLoaded()) 
                    if (!nativeAdSet) 
                        Log.d("NativeAdList", "update views resources");
                        nativeAdSet = true;

                        ImageView nativeAdIcon = (ImageView) facebookAdView.findViewById(R.id.native_ad_icon);
                        TextView nativeAdTitle = (TextView) facebookAdView.findViewById(R.id.native_ad_title);
                        TextView nativeAdBody = (TextView) facebookAdView.findViewById(R.id.native_ad_body);
                        MediaView nativeAdMedia = (MediaView) facebookAdView.findViewById(R.id.native_ad_media);
                        TextView nativeAdSocialContext = (TextView) facebookAdView.findViewById(R.id.native_ad_social_context);
                        Button nativeAdCallToAction = (Button) facebookAdView.findViewById(R.id.native_ad_call_to_action);


                        nativeAdSocialContext.setText(facebookNativeAd.getAdSocialContext());
                        nativeAdCallToAction.setText(facebookNativeAd.getAdCallToAction());
                        nativeAdTitle.setText(facebookNativeAd.getAdTitle());
                        nativeAdBody.setText(facebookNativeAd.getAdBody());
                        // Downloading and setting the ad icon.
                        NativeAd.Image adIcon = facebookNativeAd.getAdIcon();
                        NativeAd.downloadAndDisplayImage(adIcon, nativeAdIcon);
                        // Download and setting the cover image.
                        nativeAdMedia.setNativeAd(facebookNativeAd);
                        nativeAdMedia.setAutoplay(true);
                        facebookNativeAd.registerViewForInteraction(facebookAdView);
                        nativeAdCallToAction.setVisibility(View.VISIBLE);
                     else 
                        Log.d("NativeAdList", "views resources already set");
                    
                 else 
                    Log.d("NativeAdList", "nativeAdCallToAction is set invisible");
                    nativeAdCallToAction.setVisibility(View.INVISIBLE);
                
                break;
            case 1:
                view = new CustomView();
            
            return view;
    

    @Override
    public void onError(Ad ad, AdError adError) 
    

    @Override
    public void onAdLoaded(Ad ad) 
        notifyDataSetChanged();
    

    @Override
    public void onAdClicked(Ad ad) 

    

这是 Ui Automator Viewer 的截图。

【问题讨论】:

【参考方案1】:

如你所说

当我将这些广告集成到 RecyclerView 中时,我没有这个 问题(或者至少没有注意到)。

我认为回收站视图非常适合您。然后,不要尝试在 gridview 中重做相同的事情,只需使用 LayoutManager 将回收站视图转换为 grid or list。

【讨论】:

是的,我使用 GridLayoutManager 来获得类似的显示。问题是我必须“动态地”填充 RecyclerView(当我开始渲染列表时,我不知道要显示的 View 的类型),所以乍一看我认为不可能使用 RecyclerView。但我想出了如何做到这一点,只是忘记了 GridView。所以是的,这个问题的一个可能的解决方案是使用 RecyclerView 而不是 ListView/GridView。 Plus Recyclerview 比 ListView/GridView 更推荐。如果这解决了你的问题,我们可以关闭这个帖子。

以上是关于GridView 中的 Facebook 原生广告:MediaView 显示灰色矩形的主要内容,如果未能解决你的问题,请参考以下文章

ConstraintLayout 中的 MoPubRecyclerAdapter 和 Facebook 原生广告崩溃

Recyclerview - Facebook 原生广告 - 不可点击

Facebook 原生广告未显示,错误“1011 - 显示格式不匹配”

Facebook 原生广告 FBNativeAdsManagerDelegate 实现方法没有调用

Facebook原生广告无法点击,无反应

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