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 のスクリーンショットです。