问题描述
我知道这个问题已经被问过好几次了,并且由不同的人回答。 我想在“回收者”视图中显示Facebook原生广告,并且创建了如下所示的适配器
package com.zurmati.ilock.Adapter;
public class MyNativeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
List<Themes> themesList;
NativeAdsManager nativeAdsManager;
int adItems = 0;
List<NativeAd> mAdItems;
private static final int AD_disPLAY_FREQUENCY = 3;
private static final int POST_TYPE = 0;
private static final int AD_TYPE = 1;
public MyNativeAdapter(Context context,List<Themes> themesList,NativeAdsManager nativeAdsManager) {
this.context = context;
this.themesList = themesList;
this.nativeAdsManager = nativeAdsManager;
mAdItems = new ArrayList<>();
}
这是我的OnCreaViewHolder,我在其中查看视图类型,以确定接下来要放大哪个视图
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
if (viewType == AD_TYPE) {
NativeAdLayout nativeAdLayout = (NativeAdLayout) LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_native,parent,false);
return new UnifiedFbHolder(nativeAdLayout);
} else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_theme,false);
MyNativeAdapter.ImageViewHolder imageViewHolder = new MyNativeAdapter.ImageViewHolder(view);
return imageViewHolder;
}
}
这是我绑定元素的onBindViewHolder类
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder,int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case AD_TYPE:
NativeAd ad;
if (mAdItems.size() > position / AD_disPLAY_FREQUENCY) {
ad = mAdItems.get(position / AD_disPLAY_FREQUENCY);
} else {
ad = nativeAdsManager.nextNativeAd();
if (ad != null) {
if (!ad.isAdInvalidated()) {
mAdItems.add(ad);
}
}
}
UnifiedFbHolder adHolder = (UnifiedFbHolder) holder;
adHolder.adChoicesContainer.removeAllViews();
if (ad != null) {
adHolder.tvAdTitle.setText(ad.getAdvertiserName());
adHolder.tvAdBody.setText(ad.getAdBodyText());
adHolder.tvAdSocialContext.setText("Sponsored");
adHolder.btnCallToAction.setText(ad.getAdCallToAction());
adHolder.btnCallToAction.setVisibility(ad.hasCallToAction() ? View.VISIBLE : View.INVISIBLE);
AdOptionsView adOptionsView = new AdOptionsView(context,ad,adHolder.nativeAdLayout);
adHolder.adChoicesContainer.addView(adOptionsView,0);
List<View> clickAbleViews = new ArrayList<>();
clickAbleViews.add(adHolder.ivAdIcon);
clickAbleViews.add(adHolder.mvAdMedia);
clickAbleViews.add(adHolder.btnCallToAction);
ad.registerViewForInteraction(adHolder.nativeAdLayout,adHolder.mvAdMedia,adHolder.ivAdIcon,clickAbleViews);
}
break;
case POST_TYPE:
final ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
try {
Glide.with(context).load(themesList.get(holder.getAdapterPosition()).getimage()).into(imageViewHolder.imgTheme);
} catch (Exception e) {
e.printstacktrace();
}
//Event
imageViewHolder.setListener((v,pos) -> {
EventBus.getDefault().post(new ThemesItemClickEvent(themesList.get(pos).getimage(),pos,true));
});
break;
}
}
此函数生成错误,它说数组大小为17而索引为17,它正在生成超出范围的异常的索引
@Override
public int getItemCount() {
return themesList.size() + mAdItems.size();
}
@Override
public int getItemViewType(int position) {
if (position % AD_disPLAY_FREQUENCY == 0 && position != 0)
return AD_TYPE;
else
return POST_TYPE;
}
public static class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.img_theme)
ImageView imgTheme;
Unbinder unbinder;
IRecyclerClickListener listener;
public void setListener(IRecyclerClickListener listener) {
this.listener = listener;
}
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
unbinder = ButterKnife.bind(this,itemView);
itemView.setonClickListener(this);
}
@Override
public void onClick(View v) {
listener.onThemItemClick(v,getAdapterPosition());
}
}
public static class UnifiedFbHolder extends RecyclerView.ViewHolder {
public NativeAdLayout nativeAdLayout;
public MediaView mvAdMedia,ivAdIcon;
public TextView tvAdTitle,tvAdBody,tvAdSocialContext,tvAdSponsoredLable;
public Button btnCallToAction;
public LinearLayout adChoicesContainer;
public UnifiedFbHolder(NativeAdLayout nativeAdLayout) {
super(nativeAdLayout);
this.nativeAdLayout = nativeAdLayout;
mvAdMedia = nativeAdLayout.findViewById(R.id.native_ad_media);
tvAdTitle = nativeAdLayout.findViewById(R.id.native_ad_title);
tvAdBody = nativeAdLayout.findViewById(R.id.native_ad_body);
tvAdSocialContext = nativeAdLayout.findViewById(R.id.native_ad_social_context);
tvAdSponsoredLable = nativeAdLayout.findViewById(R.id.natibe_ad_sponsored_lable);
btnCallToAction = nativeAdLayout.findViewById(R.id.native_ad_call_to_action);
ivAdIcon = nativeAdLayout.findViewById(R.id.native_ad_icon);
adChoicesContainer = nativeAdLayout.findViewById(R.id.ad_choses_container);
}
}
}
这是我的主要活动代码
private List<Themes> themesList;
NativeAdsManager nativeAdsManager;
private MyNativeAdapter myNativeAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_themes,null,false);
unbinder = ButterKnife.bind(this,root);
initViews();
return root;
}
private void initViews() {
themesList = new ArrayList<>();
addAdsToList();
//Add themes into the list
addThemesToList();
recyclerView.setHasFixedSize(true);
recyclerView.hasFixedSize();
recyclerView.setItemViewCacheSize(themesList.size());
recyclerView.setnestedScrollingEnabled(false);
recyclerView.setItemAnimator(new DefaultItemAnimator());
//Set layout and orientation for recycler view
recyclerView.setLayoutManager(new GridLayoutManager(getContext(),2));
recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,0);
//Setting List to the Recycler View using adapter
// MyAdapter myAdapter = new MyAdapter(getContext(),themesList);
myNativeAdapter = new MyNativeAdapter(getContext(),themesList,nativeAdsManager);
/*FBNativeAdAdapter fbAdapter = FBNativeAdAdapter.Builder.with(getResources().getString(R.string.FbNativeAd),myAdapter)
.adItemIterval(3)
.build();*/
recyclerView.setAdapter(myNativeAdapter);
}
private void addAdsToList() {
nativeAdsManager = new NativeAdsManager(getContext(),getResources().getString(R.string.FbNativeAd),2);
nativeAdsManager.loadAds();
nativeAdsManager.setListener(this);
}
private void addThemesToList() {
themesList.add(new Themes(R.drawable.a));
themesList.add(new Themes(R.drawable.b));
themesList.add(new Themes(R.drawable.c));
themesList.add(new Themes(R.drawable.d));
themesList.add(new Themes(R.drawable.e));
themesList.add(new Themes(R.drawable.f));
themesList.add(new Themes(R.drawable.g));
themesList.add(new Themes(R.drawable.h));
themesList.add(new Themes(R.drawable.i));
themesList.add(new Themes(R.drawable.j));
themesList.add(new Themes(R.drawable.k));
themesList.add(new Themes(R.drawable.l));
themesList.add(new Themes(R.drawable.m));
themesList.add(new Themes(R.drawable.n));
themesList.add(new Themes(R.drawable.o));
themesList.add(new Themes(R.drawable.p));
themesList.add(new Themes(R.drawable.q));
}
@Override
public void onAdsLoaded() {
}
@Override
public void onAdError(AdError adError) {
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)