Android 在RecyclerView中添加admob本机广告

Android 在RecyclerView中添加admob本机广告,android,firebase,android-recyclerview,admob,firebase-admob,Android,Firebase,Android Recyclerview,Admob,Firebase Admob,我试图在recyclerview片段中为admob的本机广告做广告,该片段显示在viewpager中 我的片段看起来像: public class SunFragment extends Fragment { public static final int NUMBER_OF_ADS = 1; private AdLoader adLoader; private List<Object> mRecyclerViewItems = new ArrayList<>

我试图在
recyclerview
片段中为
admob的
本机广告做广告,该片段显示在
viewpager

我的片段看起来像:

public class SunFragment extends Fragment {
  public static final int NUMBER_OF_ADS = 1;
  private AdLoader adLoader;
  private List<Object> mRecyclerViewItems = new ArrayList<>();
  private List<UnifiedNativeAd> mNativeAds = new ArrayList<>();

  ArrayList<Object> sunsList;
  Typeface sunfont;
  Double Dlat;
  Double Dlang;

  //to be called by the MainActivity
  public SunFragment() {
    // Required empty public constructor
  }


  private static final String KEY_LOCATION_NAME = "location_name";
  public String TAG = "SunFragment";
  public String location;//="No location name found";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
      location = savedInstanceState.getCharSequence(KEY_LOCATION_NAME).toString();
      }
    setRetainInstance(true);
    loadNativeAds();
    //MainActivity activity = (MainActivity) getActivity();
    mRecyclerViewItems = this.getRecyclerViewItems();
  }
//  public List<Object> getRecyclerViewItems() {
//    return mRecyclerViewItems;
//  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
    sunsList = new ArrayList<>();
    sunsList.add(
        new SunSession(...//Populate sunsList one by one//...)
   View rootView = inflater.inflate(R.layout.fragment_sun, container, false);
    RecyclerView rv = rootView.findViewById(R.id.rv_recycler_view);
    rv.setNestedScrollingEnabled(false);
    rv.setHasFixedSize(true);
    RecyclerView.LayoutManager llm = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(llm);
//    System.out.println("location  " + location);
    setRetainInstance(true);
    RecyclerView.Adapter adapter = new SunAdapter(getContext(), sunsList);
    rv.setAdapter(adapter);
    return rootView;
  }


  @Override
  public void onSaveInstanceState(Bundle locState) {
    super.onSaveInstanceState(locState);
    if (location != null) {
      locState.putCharSequence(KEY_LOCATION_NAME, location);
    }
  }

  public List<Object> getRecyclerViewItems() {
    return mRecyclerViewItems;
  }

  private void insertAdsInMenuItems() {
    if (mNativeAds.size() <= 0) {
      return;
    }

    int offset = (mRecyclerViewItems.size() / mNativeAds.size()) + 1;
    int index = 0;
    for (UnifiedNativeAd ad : mNativeAds) {
      mRecyclerViewItems.add(index, ad);
      index = index + offset;
    }
    //loadMenu();
  }

  private void loadNativeAds() {

    Toast.makeText(getContext(), "Here I am", Toast.LENGTH_LONG).show();
    AdLoader.Builder builder = new AdLoader.Builder(getContext(), getString(R.string.ad_unit_id));
    adLoader = builder.forUnifiedNativeAd(
        new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
          @Override
          public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
            // A native ad loaded successfully, check if the ad loader has finished loading
            // and if so, insert the ads into the list.
            mNativeAds.add(unifiedNativeAd);
            if (!adLoader.isLoading()) {
              insertAdsInMenuItems();
            }
          }
        }).withAdListener(
        new AdListener() {
          @Override
          public void onAdFailedToLoad(int errorCode) {
            // A native ad failed to load, check if the ad loader has finished loading
            // and if so, insert the ads into the list.
            Log.e("MainActivity", "The previous native ad failed to load. Attempting to"
                + " load another.");
            if (!adLoader.isLoading()) {
              insertAdsInMenuItems();
            }
          }
        }).build();

    // Load the Native ads.
    adLoader.loadAds(new AdRequest.Builder().build(), NUMBER_OF_ADS);
  }
}
代码未显示任何错误,SunList数组(即
菜单项\视图\类型
)显示正确。 但是广告视图(即统一的本地广告视图类型)没有显示任何迹象,甚至没有显示为占位符

MainActivity将该片段作为viewpager调用(由默认选项卡式活动生成),如下所示:

我做错了什么

注:我使用的是firebase

更新 我怀疑,

 @Override
  public int getItemViewType(int position) {
    Object sunList = mSunsList.get(position);
    if (sunList instanceof UnifiedNativeAd) {
      System.out.println("==================Hello==============");
      return UNIFIED_NATIVE_AD_VIEW_TYPE;
    }
    return MENU_ITEM_VIEW_TYPE;
  } 
这从来都不是真的。字符串从未打印过

更新可能我发现了问题,但不知道如何解决:

如果我将
getItemViewType
更改为:

  public int getItemViewType(int position) {
    Object sunList = mSunsList.get(position);
//    if (sunList instanceof UnifiedNativeAd) {
    if (position%3==0){
      System.out.println("=================="+position+"==============");
      return UNIFIED_NATIVE_AD_VIEW_TYPE;
    }
    return MENU_ITEM_VIEW_TYPE;
  }
然后我得到一个错误:

java.lang.ClassCastException: com.example.phocast.ui.main.SunSession cannot be cast to com.google.android.gms.ads.formats.UnifiedNativeAd
onBindViewHolder
中的此行中:

UnifiedNativeAd nativeAd = (UnifiedNativeAd) mSunsList.get(position);

请提供帮助

您可以在添加时在recyclerview中加载添加。不在活动中

我认为您的母语没有正确加载。 1) 确保在recycleview中插入广告。在所有方法中添加日志,并确认已正确加载

2) 在测试应用程序期间使用测试广告id

3) 加载ADS后,使用更新recycleview

adapter.notifyDataSetChanged();
4) 下面的方法没有问题

@Override
  public int getItemViewType(int position) {
    Object sunList = mSunsList.get(position);
    if (sunList instanceof UnifiedNativeAd) {
      System.out.println("==================Hello==============");
      return UNIFIED_NATIVE_AD_VIEW_TYPE;
    }
    return MENU_ITEM_VIEW_TYPE;
  } 

如果仍然没有收到广告,请告诉我。

我确实认为第一点是原因,但我不知道如何纠正这一点是的……这可能不是问题所在。问题是,就像在中一样,我不知道如何在viewpager中执行此操作adapter@BaRud这是我指的codelab中的同一页:),然后用示例代码替换您的代码。就这样。顺便说一句,它对我来说非常有效。
UnifiedNativeAd nativeAd = (UnifiedNativeAd) mSunsList.get(position);
adapter.notifyDataSetChanged();
@Override
  public int getItemViewType(int position) {
    Object sunList = mSunsList.get(position);
    if (sunList instanceof UnifiedNativeAd) {
      System.out.println("==================Hello==============");
      return UNIFIED_NATIVE_AD_VIEW_TYPE;
    }
    return MENU_ITEM_VIEW_TYPE;
  }