Search code examples
javaandroidandroid-recyclerviewadapter

getActivity() in adapter


I'm loading ads in onClick of RecyclerView's adapter.

In fragment it is perfectly working in this code: interstitialAd.loadAd(GDPR.getAdRequest(getActivity()));

But in adapter it is not working in these method I tried: mInterstitialAd.loadAd(GDPR.getAdRequest(context));

I also tried this but it is not working: mInterstitialAd.loadAd(GDPR.getAdRequest(this));

GDPR.getAdRequest's code is:

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

this is adapter's code:

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);

        }
}
}

Solution

  • It's just because you are sending Context object to the method getAdRequest(Activity activity) which needs Activity object. So you can fix it in 2 ways

    1. Change adapter to take Activity not Context. like below

      public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.VideosViewHolder> {
      private Activity activity;
      ..
      
      public VideosAdapter(Activity activity, Video[] data, int layout) {
          this.activity = activity;
          ...
      }
      
    2. The second way to fix this is, change getAdRequest(Activity activity), like below

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

    But in the second way, I am not sure if GDPR.getBundleAd() can take context. So better to go with 1st way


    3rd way is to typecast context as Activity as you commented. Like

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

    But there is one problem in this approach. As the constructor of your adapter take Context parameter, any Activity which using this adapter can create the object like new VideosAdapter(activity, ...) BUT can create the object like new VideosAdapter(applicationContext, ...) or new VideosAdapter(objectOfcontext, ...). So in the last 2 cases, you will get a typecast exception.