我想在 Recycler 视图中显示 NativeExpressAdView 我面临着主要的滞后问题,尤其是在果冻豆和较低的设备上
以下是我在 Activity 中加载广告的代码
public NativeExpressAdView getNativeAd(AdSize adSize, boolean isFirstIndex) {
final NativeExpressAdView nativeExpressAdView = new NativeExpressAdView(this);
nativeExpressAdViews.add(nativeExpressAdView);
if (isFirstIndex) {
nativeExpressAdView.setAdUnitId(getString(R.string.test_adunit_id));
} else {
nativeExpressAdView.setAdUnitId(getString(R.string.test_adunit_id));
}
nativeExpressAdView.setAdSize(adSize);
new Handler(getMainLooper()).post(new AdsRunnable(new WeakReference<NativeExpressAdView>(nativeExpressAdView)));
return nativeExpressAdView;
}
static class AdsRunnable implements Runnable {
private WeakReference<NativeExpressAdView> nativeExpressAdViewWeakReference;
public AdsRunnable(WeakReference<NativeExpressAdView> nativeExpressAdViewWeakReference) {
this.nativeExpressAdViewWeakReference = nativeExpressAdViewWeakReference;
}
@Override
public void run() {
if (nativeExpressAdViewWeakReference.get() != null) {
nativeExpressAdViewWeakReference.get().loadAd(AdRequestManager.getAdRequest());
}
}
}
现在在 Fragment 中,我正在更新 adpater,如下所示
public void loadAds(final int index) {
if (!isAdsAllowed() || index > mAdapter.getItemCount() || index > Constants.ADS_FIRST_INDEX + ((Constants.TOTAL_ADS_PER_PAGE - 1) * ADS_NEXT_INDEX))
return;
if (index < mAdapter.getItemCount() && !mAdapter.getItem(index).isAdItem && getActivity() != null) {
final NativeExpressAdView nativeExpressAdView = ((BaseActivity) getActivity()).getNativeAd(new AdSize(AD_WIDTH, AD_HEIGHT), nativeExpressAdViews.size() == 0);
nativeExpressAdViews.add(nativeExpressAdView);
mAdapter.addItem(new DealItem(true), index, nativeExpressAdView);
nativeExpressAdView.setAdListener(getAdListener(nativeExpressAdView.getAdUnitId(), index, nativeExpressAdView.getMediationAdapterClassName()));
}
}
以下是我在适配器内的代码
HashMap<Integer, NativeExpressAdView> nativeExpressAdViewMap = new HashMap<>();
@Override
public int getItemViewType(int position) {
if (items.get(position).isAdItem) {
return VIEW_TYPE_AD;
} else {
return VIEW_TYPE_DEAL;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_AD:
View nativeExpressLayoutView = LayoutInflater.from(
parent.getContext()).inflate(R.layout.activity_main_native_express_ad_container,
parent, false);
DealsRecyclerAdapter.NativeExpressAdViewHolder nativeExpressAdViewHolder = new DealsRecyclerAdapter.NativeExpressAdViewHolder(nativeExpressLayoutView);
return nativeExpressAdViewHolder;
case VIEW_TYPE_DEAL:
default:
View v = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
DealsRecyclerAdapter.ViewHolder vh = new DealsRecyclerAdapter.ViewHolder(v);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
item = (DealItem) items.get(position);
Context context = holder.itemView.getContext();
if (!item.isAdItem) {
//some code here not related ads
} else {
if (nativeExpressAdViewMap.containsKey(position)) {
DealsRecyclerAdapter.NativeExpressAdViewHolder nativeExpressHolder =
(DealsRecyclerAdapter.NativeExpressAdViewHolder) holder;
NativeExpressAdView adView =
(NativeExpressAdView) nativeExpressAdViewMap.get(position);
ViewGroup adCardView = (ViewGroup) nativeExpressHolder.itemView;
// The NativeExpressAdViewHolder recycled by the RecyclerView may be a different
// instance than the one used previously for this position. Clear the
// NativeExpressAdViewHolder of any subviews in case it has a different
// AdView associated with it, and make sure the AdView for this position doesn't
// already have a parent of a different recycled NativeExpressAdViewHolder.
if (adCardView.getChildCount() > 0) {
adCardView.removeAllViews();
}
if (adView.getParent() != null) {
((ViewGroup) adView.getParent()).removeView(adView);
}
adCardView.addView(adView);
}
}
holder.itemView.setTag(item);
}
public void addItem(DealItem dealItem, int index, NativeExpressAdView nativeExpressAdView) {
if (index < items.size()) {
items.add(index, dealItem);
nativeExpressAdViewMap.put(index, nativeExpressAdView);
}
}