5

我将 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 的屏幕截图。

在此处输入图像描述

4

1 回答 1

3

如你所说

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

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

于 2016-08-01T05:51:57.740 回答