【发布时间】: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 的截图。
【问题讨论】:
标签: android gridview facebook-audience-network