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 - 显示格式不匹配”