【问题标题】:getActivity() in adapter适配器中的 getActivity()
【发布时间】:2020-05-20 05:46:48
【问题描述】:

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

在片段中,它在以下代码中完美运行: 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);

        }
}
}

【问题讨论】:

  • 可能你的Adapter类有问题。如果你显示适配器的代码,有人可以给你一个解决方案。
  • not working 是什么意思?没有显示添加?或者你正在崩溃?您能否发布您在 logcat 中看到的错误?谢谢!
  • @ReazMurshed 显示红色下划线错误。
  • 我不太确定.. 你到底在哪里看到错误?如果能发个截图就好了。
  • @ReazMurshed 这是错误:getAdRequest(android.app.Activity) in GDPR cannot be applied into (android.Context.context) 运行时错误

标签: java android android-recyclerview adapter


【解决方案1】:

这只是因为您将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() 是否可以获取上下文。所以最好选择第一种方式


第三种方法是将上下文类型转换为Activity,正如您评论的那样。喜欢

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

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

【讨论】:

  • 它为我工作mInterstitialAd.loadAd(GDPR.getAdRequest((Activity) context)); 使用 Activity 而不是上下文可能会影响与该适配器链接的其他活动。如果您提出这个想法来自您,我很乐意为您的答案打勾
  • @madan 是的,在您通过传递 Activity 创建适配器对象之前,它将一直有效。请参阅我编辑的答案,该方法存在一个问题。但是在您传递活动以创建 adpater 对象之前,这种方法很好
【解决方案2】:

您应该将一个 Activity 对象传递给您的适配器。否则你将面临这个错误。 像这样使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多