适配器中的 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)
。所以你可以通过两种方式修复它
更改适配器以使用 Activity
而不是 Context
。如下所示
public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.VideosViewHolder> {
private Activity activity;
..
public VideosAdapter(Activity activity, Video[] data, int layout) {
this.activity = activity;
...
}
解决此问题的第二种方法是,更改 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);
我正在 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)
。所以你可以通过两种方式修复它
更改适配器以使用
Activity
而不是Context
。如下所示public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.VideosViewHolder> { private Activity activity; .. public VideosAdapter(Activity activity, Video[] data, int layout) { this.activity = activity; ... }
解决此问题的第二种方法是,更改
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);