Я пытаюсь внедрить этот код из примеров Google в моем приложении.У этого есть два наблюдателя в программе просмотра объявлений Adview и MenuItem.Он отлично работает, если он реализован в деятельности.Но в моем случае я использую фрагмент для нижней навигационной панели.Он работает при первом открытии фрагмента через нижнюю панель, но после этого выдает исключение приведения.
java.lang.ClassCastException: com.google.android.gms.ads.AdView cannot be cast to com.neupanedinesh.models.MenuItem
at com.neupanedinesh.adapters.RecyclerViewAdapter.onBindViewHolder
Я изменил тип доступа onResume, onPause и onDestroy фрагмента с защищенного на публичный.
@Override
public void onResume() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.resume();
}
}
super.onResume();
}
@Override
public void onPause() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.pause();
}
}
super.onPause();
}
@Override
public void onDestroy() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.destroy();
}
}
super.onDestroy();
}
Это мой адаптер recyclerviiew:
package com.neupanedinesh.adapters;
import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.android.gms.ads.AdView;
import com.neupanedinesh.coolcaptions.MenuItemFragment;
import com.neupanedinesh.coolcaptions.R;
import com.neupanedinesh.models.MenuItem;
import java.util.List;
/**
* The {@link RecyclerViewAdapter} class.
* <p>The adapter provides access to the items in the {@link MenuItemViewHolder}
* or the {@link AdViewHolder}.</p>
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// A menu item view type.
private static final int MENU_ITEM_VIEW_TYPE = 0;
// The banner ad view type.
private static final int BANNER_AD_VIEW_TYPE = 1;
// An Activity's Context.
private final Context context;
// The list of banner ads and menu items.
private final List<Object> recyclerViewItems;
/**
* For this example app, the recyclerViewItems list contains only
* {@link MenuItem} and {@link AdView} types.
*/
public RecyclerViewAdapter(Context context, List<Object> recyclerViewItems) {
this.context = context;
this.recyclerViewItems = recyclerViewItems;
}
/**
* The {@link MenuItemViewHolder} class.
* Provides a reference to each view in the menu item view.
*/
public class MenuItemViewHolder extends RecyclerView.ViewHolder {
private TextView menuItemName;
MenuItemViewHolder(View view) {
super(view);
menuItemName = view.findViewById(R.id.menu_item_name);
}
}
/**
* The {@link AdViewHolder} class.
*/
public class AdViewHolder extends RecyclerView.ViewHolder {
AdViewHolder(View view) {
super(view);
}
}
@Override
public int getItemCount() {
return recyclerViewItems.size();
}
/**
* Determines the view type for the given position.
*/
@Override
public int getItemViewType(int position) {
return (position % MenuItemFragment.ITEMS_PER_AD == 0) ? BANNER_AD_VIEW_TYPE
: MENU_ITEM_VIEW_TYPE;
}
/**
* Creates a new view for a menu item view or a banner ad view
* based on the viewType. This method is invoked by the layout manager.
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType) {
case MENU_ITEM_VIEW_TYPE:
View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.menu_item_container, viewGroup, false);
return new MenuItemViewHolder(menuItemLayoutView);
case BANNER_AD_VIEW_TYPE:
// fall through
default:
View bannerLayoutView = LayoutInflater.from(
viewGroup.getContext()).inflate(R.layout.banner_ad_container,
viewGroup, false);
return new AdViewHolder(bannerLayoutView);
}
}
/**
* Replaces the content in the views that make up the menu item view and the
* banner ad view. This method is invoked by the layout manager.
*/
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case MENU_ITEM_VIEW_TYPE:
MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
MenuItem menuItem = (MenuItem) recyclerViewItems.get(position);
menuItemHolder.menuItemName.setText(menuItem.getName());
break;
case BANNER_AD_VIEW_TYPE:
// fall through
default:
AdViewHolder bannerHolder = (AdViewHolder) holder;
AdView adView = (AdView) recyclerViewItems.get(position);
ViewGroup adCardView = (ViewGroup) bannerHolder.itemView;
// The AdViewHolder recycled by the RecyclerView may be a different
// instance than the one used previously for this position. Clear the
// AdViewHolder of any subviews in case it has a different
// AdView associated with it, and make sure the AdView for this position doesn't
// already have a parent of a different recycled AdViewHolder.
if (adCardView.getChildCount() > 0) {
adCardView.removeAllViews();
}
if (adView.getParent() != null) {
((ViewGroup) adView.getParent()).removeView(adView);
}
// Add the banner ad to the ad view.
adCardView.addView(adView);
}
}
}
А это мой фрагментный класс:
package com.neupanedinesh.coolcaptions;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import java.util.ArrayList;
import java.util.List;
import com.neupanedinesh.adapters.RecyclerViewAdapter;
import com.neupanedinesh.models.MenuItem;
/**
* A simple {@link Fragment} subclass.
*/
public class MenuItemFragment extends Fragment {
// A banner ad is placed in every 8th position in the RecyclerView.
public static final int ITEMS_PER_AD = 8;
private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/4177191030";
// The RecyclerView that holds and displays banner ads and menu items.
private RecyclerView recyclerView;
// List of banner ads and MenuItems that populate the RecyclerView.
private List<Object> recyclerViewItems = new ArrayList<>();
public MenuItemFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_menu_item, container, false);
recyclerView = view.findViewById(R.id.recycler_view);
// Use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView.
recyclerView.setHasFixedSize(true);
// Specify a linear layout manager.
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
// Update the RecyclerView item's list with menu items and banner ads.
addMenuItemsFromJson();
addBannerAds();
loadBannerAds();
// Specify an adapter.
RecyclerView.Adapter<RecyclerView.ViewHolder> adapter = new RecyclerViewAdapter(getActivity(),
recyclerViewItems);
recyclerView.setAdapter(adapter);
return view;
}
@Override
public void onResume() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.resume();
}
}
super.onResume();
}
@Override
public void onPause() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.pause();
}
}
super.onPause();
}
@Override
public void onDestroy() {
for (Object item : recyclerViewItems) {
if (item instanceof AdView) {
AdView adView = (AdView) item;
adView.destroy();
}
}
super.onDestroy();
}
/**
* Adds banner ads to the items list.
*/
private void addBannerAds() {
// Loop through the items array and place a new banner ad in every ith position in
// the items List.
for (int i = 0; i <= recyclerViewItems.size(); i += ITEMS_PER_AD) {
final AdView adView = new AdView(getActivity());
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId(AD_UNIT_ID);
recyclerViewItems.add(i, adView);
}
}
/**
* Sets up and loads the banner ads.
*/
private void loadBannerAds() {
// Load the first banner ad in the items list (subsequent ads will be loaded automatically
// in sequence).
loadBannerAd(0);
}
/**
* Loads the banner ads in the items list.
*/
private void loadBannerAd(final int index) {
if (index >= recyclerViewItems.size()) {
return;
}
Object item = recyclerViewItems.get(index);
if (!(item instanceof AdView)) {
throw new ClassCastException("Expected item at index " + index + " to be a banner ad"
+ " ad.");
}
final AdView adView = (AdView) item;
// Set an AdListener on the AdView to wait for the previous banner ad
// to finish loading before loading the next ad in the items list.
adView.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
// The previous banner ad loaded successfully, call this method again to
// load the next ad in the items list.
loadBannerAd(index + ITEMS_PER_AD);
}
@Override
public void onAdFailedToLoad(int errorCode) {
// The previous banner ad failed to load. Call this method again to load
// the next ad in the items list.
/* Log.e("MainActivity", "The previous banner ad failed to load. Attempting to"
+ " load the next banner ad in the items list.");*/
loadBannerAd(index + ITEMS_PER_AD);
}
});
// Load the banner ad.
adView.loadAd(new AdRequest.Builder().build());
}
private void addMenuItemsFromJson() {
String menuItemName="item";
MenuItem menuItem = new MenuItem(menuItemName);
recyclerViewItems.add(menuItem);
}
}