如何使用recyclerview实施高级原生广告?

时间:2020-01-28 13:00:50

标签: java android android-recyclerview

我,已经在Android中实现了recyclerview。现在,我正在尝试在android中实现高级原生广告。为此,我一直在关注Google Codelabs教程。 Link of the tutorial。但是我没有成功。下面是我的recyclerview代码。然后是我尝试在recyclerview中实施高级原生广告的代码。

Recyclerview适配器:

public class CouponDealsAdapter extends RecyclerView.Adapter<CouponDealsAdapter.ViewHolder> {

    public List<CouponDeal> couponDeals;
    public Context context;

    public CouponDealsAdapter(Context context, List<CouponDeal> couponDeals) {

        this.couponDeals = couponDeals;
        this.context = context;

    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView store_name;


        View mView;


        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;

            store_name = (TextView) mView.findViewById(R.id.couponDeals_storeName);
        }
    }

    @Override
    public int getItemCount() {
        return couponDeals.size();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.coupons_deal, parent, false);
        final ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        if (TextUtils.isEmpty(couponDeals.get(position).getStore_name())) {
            holder.store_name.setText("Not Available");
        } else {
            holder.store_name.setText(couponDeals.get(position).getStore_name());
        }
    }
}

UnifiedNativeAdViewHolder:

公共类UnifiedNativeAdViewHolder扩展了RecyclerView.ViewHolder {

private UnifiedNativeAdView adView;

public UnifiedNativeAdView getAdView() {
    return adView;
}

UnifiedNativeAdViewHolder(View view) {
    super(view);
    adView = (UnifiedNativeAdView) view.findViewById(R.id.ad_view);

    // The MediaView will display a video asset if one is present in the ad, and the
    // first image asset otherwise.
    adView.setMediaView((MediaView) adView.findViewById(R.id.ad_media));

    // Register the view used for each individual asset.
    adView.setHeadlineView(adView.findViewById(R.id.ad_headline));
    adView.setBodyView(adView.findViewById(R.id.ad_body));
    adView.setCallToActionView(adView.findViewById(R.id.ad_call_to_action));
    adView.setIconView(adView.findViewById(R.id.ad_icon));
    adView.setPriceView(adView.findViewById(R.id.ad_price));
    adView.setStarRatingView(adView.findViewById(R.id.ad_stars));
    adView.setStoreView(adView.findViewById(R.id.ad_store));
    adView.setAdvertiserView(adView.findViewById(R.id.ad_advertiser));
}

Recyclerview Adapter和Add Implementation遵循codelab的教程。

public class CouponDealsAdapter extends RecyclerView.Adapter<CouponDealsAdapter.ViewHolder> {

    private static final int MENU_ITEM_VIEW_TYPE = 0;
    private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;

    public List<CouponDeal> couponDeals;
    public Context context;

    public CouponDealsAdapter(Context context, List<CouponDeal> couponDeals) {

        this.couponDeals = couponDeals;
        this.context = context;

    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView store_name;

        View mView;


        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;

            store_name = (TextView) mView.findViewById(R.id.couponDeals_storeName);

        }
    }

    @Override
    public int getItemCount() {
        return couponDeals.size();
    }

    @Override
    public int getItemViewType(int position) {

        Object recyclerViewItem = couponDeals.get(position);
        if (recyclerViewItem instanceof UnifiedNativeAd) {
            return UNIFIED_NATIVE_AD_VIEW_TYPE;
        }
        return MENU_ITEM_VIEW_TYPE;
    }



    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case UNIFIED_NATIVE_AD_VIEW_TYPE:
                View unifiedNativeLayoutView = LayoutInflater.from(
                        parent.getContext()).inflate(R.layout.ad_unified,
                        parent, false);
                return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
            case MENU_ITEM_VIEW_TYPE:

            default:
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.coupons_deal, parent, false);
                return new ViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        int viewType = getItemViewType(position);
        switch (viewType) {
            case UNIFIED_NATIVE_AD_VIEW_TYPE:
                UnifiedNativeAd nativeAd = (UnifiedNativeAd) couponDeals.get(position);
                populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder) holder).getAdView());
                break;
            case MENU_ITEM_VIEW_TYPE:
                // fall through
            default:

                if (TextUtils.isEmpty(couponDeals.get(position).getStore_name())) {
                    holder.store_name.setText("Not Available");
                } else {
                    holder.store_name.setText(couponDeals.get(position).getStore_name());
                }

        }

    }

    private void populateNativeAdView(UnifiedNativeAd nativeAd,
                                      UnifiedNativeAdView adView) {
        // Some assets are guaranteed to be in every UnifiedNativeAd.
        ((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline());
        ((TextView) adView.getBodyView()).setText(nativeAd.getBody());
        ((Button) adView.getCallToActionView()).setText(nativeAd.getCallToAction());

        // These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
        // check before trying to display them.
        NativeAd.Image icon = nativeAd.getIcon();

        if (icon == null) {
            adView.getIconView().setVisibility(View.INVISIBLE);
        } else {
            ((ImageView) adView.getIconView()).setImageDrawable(icon.getDrawable());
            adView.getIconView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getPrice() == null) {
            adView.getPriceView().setVisibility(View.INVISIBLE);
        } else {
            adView.getPriceView().setVisibility(View.VISIBLE);
            ((TextView) adView.getPriceView()).setText(nativeAd.getPrice());
        }

        if (nativeAd.getStore() == null) {
            adView.getStoreView().setVisibility(View.INVISIBLE);
        } else {
            adView.getStoreView().setVisibility(View.VISIBLE);
            ((TextView) adView.getStoreView()).setText(nativeAd.getStore());
        }

        if (nativeAd.getStarRating() == null) {
            adView.getStarRatingView().setVisibility(View.INVISIBLE);
        } else {
            ((RatingBar) adView.getStarRatingView())
                    .setRating(nativeAd.getStarRating().floatValue());
            adView.getStarRatingView().setVisibility(View.VISIBLE);
        }

        if (nativeAd.getAdvertiser() == null) {
            adView.getAdvertiserView().setVisibility(View.INVISIBLE);
        } else {
            ((TextView) adView.getAdvertiserView()).setText(nativeAd.getAdvertiser());
            adView.getAdvertiserView().setVisibility(View.VISIBLE);
        }

        // Assign native ad object to the native view.
        adView.setNativeAd(nativeAd);
    }
}

我不知道这是否是实现它的正确方法。我只是遵循codelabs教程。我也遇到一些错误。下面提到。

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case UNIFIED_NATIVE_AD_VIEW_TYPE:
                View unifiedNativeLayoutView = LayoutInflater.from(
                        parent.getContext()).inflate(R.layout.ad_unified,
                        parent, false);
                return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
            case MENU_ITEM_VIEW_TYPE: 

在这段代码中,我在这一行中遇到错误。 返回新的UnifiedNativeAdViewHolder(unifiedNativeLayoutView);

错误是:不兼容的类型:

必需:com.release.adapter.RecyclerViewAdapter.ViewHolder

找到:com.release.adapter.UnifiedNativeAdViewHolder

另一个错误:

@Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        int viewType = getItemViewType(position);
        switch (viewType) {
            case UNIFIED_NATIVE_AD_VIEW_TYPE:
                UnifiedNativeAd nativeAd = (UnifiedNativeAd) couponDeals.get(position);
                populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder) holder).getAdView());
                break;

此行出现错误。 UnifiedNativeAd nativeAd =(UnifiedNativeAd)couponDeals.get(position);

错误:不兼容的类型:RecyclerViewAdapter.ViewHolder无法转换为UnifiedNativeAdViewHolder

请帮助我解决这些错误。这是正确的实施方式。或者,请告诉编写代码以实施高级原生广告。

0 个答案:

没有答案
相关问题