5

Facebook ネイティブ広告を GridView に統合しました。とりあえず、テスト広告を表示します。ビデオを再生するものを除いて、正常に動作します。

ユーザーが GridView を操作しなければ、MediaView は問題なくビデオを再生しますGridView がスクロールされているとき、ビデオは一時停止され、Ad が画面に再表示されると再開されます。

グリッドを上下に数回スクロールした後、MediaView にはビデオが表示されなくなり、単に灰色の四角形が表示されます。

好奇心から、MediaView が灰色のときにデバイスでUi 自動ビューアーを実行しようとしました。面白いことに気づきましたが、よくわかりません。

ビュー階層では、いくつかの子 FrameLayout (アダプターによって指定されたビューのコンテナー) を持つ GridView を確認できます。これには、ネイティブ広告とその他のビューが含まれます。

しかし、MediaView がグレーの場合、その FrameLayoutはビュー階層に表示されません。しかし、それは画面上でうまくレンダリングされます!

私は自分が見ているものに非常に困惑しています。

また、これらの広告を 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 に答える