1

我想在 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);
    }
}
4

0 回答 0