适配器中的 getActivity()

getActivity() in adapter

我正在 RecyclerView 的适配器的 onClick 中加载广告。

在片段中,这段代码完美运行: interstitialAd.loadAd(GDPR.getAdRequest(getActivity()));

但是在适配器中,我试过的这些方法不起作用: mInterstitialAd.loadAd(GDPR.getAdRequest(context));

我也试过这个但是没有用: mInterstitialAd.loadAd(GDPR.getAdRequest(this));

GDPR.getAdRequest的代码是:

public static AdRequest getAdRequest(Activity activity) {
    return new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, GDPR.getBundleAd(activity))
        .build();
}

这是适配器的代码:

public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.VideosViewHolder> {
    private Context context;
    private Video[] data;
    private int layout;
    private InterstitialAd mInterstitialAd;

    public VideosAdapter(Context context, Video[] data, int layout) {
        this.context = context;
        this.data = data;
        this.layout = layout;
    }

    @NonNull
    @Override
    public VideosViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(layout,null);
        return new VideosViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull VideosViewHolder holder, final int position) {
        final Video selectedItem = data[position];
        holder.videoTitle.setText(selectedItem.getVideoTitle());
        holder.videoCategoryTitle.setText(selectedItem.getCategoryName());
        if (selectedItem.getVideoType().equals("0")){
            String thumbImg = Constants.SERVER_IMG_FIRST + selectedItem.getVideoThumb();
            Glide.with(context).load(Uri.parse(thumbImg)).into(holder.videoThumb);
        }else {
            // Get V and display img
            Uri uri = Uri.parse(selectedItem.getVideoUrl());
            String videoId = uri.getQueryParameter("v");
            String thumbYtImg = Constants.YOUTUBE_IMG_FIRST + videoId + Constants.YOUTUBE_IMG_BACK;
            Glide.with(context).load(Uri.parse(thumbYtImg)).into(holder.videoThumb);
        }
        String thumbCat = Constants.SERVER_IMG_FIRST + selectedItem.getCategoryThumb();
        Glide.with(context).load(Uri.parse(thumbCat)).into(holder.videoCategoryThumb);
        holder.videoInfoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (Constants.SETTINGS.getAdmob().equals("1")){
                    Constants.ADS_COUNT++;
                    if (Constants.ADS_COUNT>=Integer.valueOf(Constants.SETTINGS.getAdmobIntrestitialAdDisplayAfter())){
                        Constants.ADS_COUNT = 0;
                        mInterstitialAd = new InterstitialAd(context);
                        mInterstitialAd.setAdUnitId(Constants.SETTINGS.getAdmobIntrestitialId());
                        mInterstitialAd.loadAd(GDPR.getAdRequest(context));

                        mInterstitialAd.setAdListener(new AdListener() {
                            @Override
                            public void onAdLoaded() {
                                super.onAdLoaded();
                                if(mInterstitialAd.isLoaded()){
                                    mInterstitialAd.show();
                                }
                            }

                            @Override
                            public void onAdFailedToLoad(int errorCode) {
                                // Code to be executed when an ad request fails.
                                toDoOnInfoBtnClicked(position,data);
                            }

                            @Override
                            public void onAdClosed() {
                                // Code to be executed when the interstitial ad is closed.
                                toDoOnInfoBtnClicked(position,data);
                            }
                        });


                    }else{
                        toDoOnInfoBtnClicked(position,data);
                    }

                }else{
                    toDoOnInfoBtnClicked(position,data);
                }

            }
        });
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    public class VideosViewHolder extends RecyclerView.ViewHolder {
        TextView videoTitle,videoCategoryTitle;
        public VideosViewHolder(@NonNull View itemView) {
            super(itemView);
            videoTitle = itemView.findViewById(R.id.video_title);
            videoCategoryTitle = itemView.findViewById(R.id.video_category_title);

        }
}
}

只是因为您将 Context 对象发送到需要 Activity 对象的方法 getAdRequest(Activity activity)。所以你可以通过两种方式修复它

  1. 更改适配器以使用 Activity 而不是 Context。如下所示

    public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.VideosViewHolder> {
    private Activity activity;
    ..
    
    public VideosAdapter(Activity activity, Video[] data, int layout) {
        this.activity = activity;
        ...
    }
    
  2. 解决此问题的第二种方法是,更改 getAdRequest(Activity activity),如下所示

    public static AdRequest getAdRequest(Context context) {
    return new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, GDPR.getBundleAd(context))
        .build();
    }
    

但是第二种方式,我不确定GDPR.getBundleAd()是否可以取context。所以最好选择第一种方式


第三种方法是按照您的评论将上下文类型转换为 Activity。喜欢

mInterstitialAd.loadAd(GDPR.getAdRequest((Activity) context));

但是这种方法有一个问题。由于适配器的构造函数采用 Context 参数,因此使用此适配器的任何 Activity 都可以创建 new VideosAdapter(activity, ...) 之类的对象,但可以创建 new VideosAdapter(applicationContext, ...) 之类的对象或 new VideosAdapter(objectOfcontext, ...)。所以在后两种情况下,你会得到类型转换异常。

您应该将 Activity 对象传递给您的适配器。否则你会遇到那个错误。 像这样使用:

adapter = new VideosAdapter(YourActivity.this,yourData,R.layout.some_layout);