我想用firebase数据库在recyclerview中实现admob原生广告,但是这些项目无法正确显示(其中一些缺失),而且当我更新数据库时,这些项目也会消失并且广告数量会增加。这是我的代码: MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String APPID = "ca-app-pub-3940256099942544~3347511713" ;
private static final String ADSID = "ca-app-pub-3940256099942544/1033173712" ;
public static final int NUMBER_OF_ADS = 5;
// The AdLoader used to load ads.
private AdLoader adLoader;
private List<Object> mRecyclerViewItems = new ArrayList<>();
private List<UnifiedNativeAd> mNativeAds = new ArrayList<>();
private AdView mAdView;
private InterstitialAd mInterstitialAd;
//private List<Object> mArrayList ;
private RecyclerView mRecyclerView ;
private RecyclerView.Adapter mRecyclerViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this,APPID);
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("ITEMS");
mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//List<Object> mRecyclerViewItems = new ArrayList<>();
for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
{
Fixture mFixture = dataSnapshot1.getValue(Fixture.class);
mRecyclerViewItems.add(mFixture);
}
mRecyclerViewAdapter = new RecyclerViewAdapter(MainActivity.this,mRecyclerViewItems);
mRecyclerView.setAdapter(mRecyclerViewAdapter);
Toast.makeText(MainActivity.this, "Tips Uploaded Successfully", Toast.LENGTH_SHORT).show();
loadNativeAds();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "Upload Failed...", Toast.LENGTH_SHORT).show();
}
});
}
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;
}
}
private void loadNativeAds() {
AdLoader.Builder builder = new AdLoader.Builder(this, 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);
}
@Override
public void onPause() {
if (mAdView != null) {
mAdView.pause();
}
super.onPause();
}
/** Called when returning to the activity */
@Override
public void onResume() {
super.onResume();
if (mAdView != null) {
mAdView.resume();
}
}
/** Called before the activity is destroyed */
@Override
public void onDestroy() {
if (mAdView != null) {
mAdView.destroy();
}
super.onDestroy();
}
}
RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// A menu item view type.
private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
// An Activity's Context.
private final Context mContext;
private final List<Object> mRecyclerViewItems;
/**
* For this example app, the recyclerViewItems list contains only
* {@link MenuItem} and {@link UnifiedNativeAd} types.
*/
public RecyclerViewAdapter(Context mContext, List<Object> recyclerViewItems) {
this.mContext = mContext;
this.mRecyclerViewItems = recyclerViewItems;
}
/**
* The {@link MenuItemViewHolder} class.
* Provides a reference to each view in the menu item view.
*/
public class MenuItemViewHolder extends RecyclerView.ViewHolder {
private TextView item1;
private TextView item2;
private TextView item3;
private TextView item4;
private TextView item5;
MenuItemViewHolder(View view) {
super(view);
item1 = (TextView) view.findViewById(R.id.item1);
item2 = (TextView) view.findViewById(R.id.item2);
item3 = (TextView) view.findViewById(R.id.item3);
item4 = (TextView) view.findViewById(R.id.item4);
item5 = (TextView) view.findViewById(R.id.item5);
}
}
@Override
public int getItemCount() {
return mRecyclerViewItems.size();
}
/**
* Determines the view type for the given position.
*/
@Override
public int getItemViewType(int position) {
Object recyclerViewItem = mRecyclerViewItems.get(position);
if (recyclerViewItem instanceof UnifiedNativeAd) {
return UNIFIED_NATIVE_AD_VIEW_TYPE;
}
return MENU_ITEM_VIEW_TYPE;
}
/**
* Creates a new view for a menu item view or a Native ad view
* based on the viewType. This method is invoked by the layout manager.
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
switch (viewType) {
case UNIFIED_NATIVE_AD_VIEW_TYPE:
View unifiedNativeLayoutView;
LayoutInflater inflaterNative = LayoutInflater.from(mContext);
unifiedNativeLayoutView = inflaterNative.inflate(R.layout.ad_unified,viewGroup,false);
return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);
case MENU_ITEM_VIEW_TYPE:
// Fall through.
default:
View menuItemLayoutView;
LayoutInflater inflater = LayoutInflater.from(mContext);
menuItemLayoutView = inflater.inflate(R.layout.fixture_row,viewGroup,false);
return new MenuItemViewHolder(menuItemLayoutView);
/*
View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.fixture_row, viewGroup, false);
return new MenuItemViewHolder(menuItemLayoutView);*/
}
}
/**
* Replaces the content in the views that make up the menu item view and the
* Native 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 UNIFIED_NATIVE_AD_VIEW_TYPE:
UnifiedNativeAd nativeAd = (UnifiedNativeAd) mRecyclerViewItems.get(position);
populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder) holder).getAdView());
break;
case MENU_ITEM_VIEW_TYPE:
// fall through
default:
MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
Fixture fixture = (Fixture) mRecyclerViewItems.get(position);
// Add the menu item details to the menu item view.
menuItemHolder.item1.setText(fixture.getItem1());
menuItemHolder.item2.setText(fixture.getItem2());
menuItemHolder.item3.setText(fixture.getItem3());
menuItemHolder.item4.setText(fixture.getItem4());
menuItemHolder.item5.setText(fixture.getItem5());
}
}
private void populateNativeAdView(UnifiedNativeAd nativeAd,
UnifiedNativeAdView adView) {
// Some assets are guaranteed to be in every UnifiedNativeAd.
((TextView) adView.getHeadlineView()).setText(nativeAd.getHeadline());
((TextView) adView.getBodyView()).setText(nativeAd.getBody());
((Button) adView.getCallToActionView()).setText(nativeAd.getCallToAction());
// These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
// check before trying to display them.
NativeAd.Image icon = nativeAd.getIcon();
if (icon == null) {
adView.getIconView().setVisibility(View.INVISIBLE);
} else {
((ImageView) adView.getIconView()).setImageDrawable(icon.getDrawable());
adView.getIconView().setVisibility(View.VISIBLE);
}
if (nativeAd.getPrice() == null) {
adView.getPriceView().setVisibility(View.INVISIBLE);
} else {
adView.getPriceView().setVisibility(View.VISIBLE);
((TextView) adView.getPriceView()).setText(nativeAd.getPrice());
}
if (nativeAd.getStore() == null) {
adView.getStoreView().setVisibility(View.INVISIBLE);
} else {
adView.getStoreView().setVisibility(View.VISIBLE);
((TextView) adView.getStoreView()).setText(nativeAd.getStore());
}
if (nativeAd.getStarRating() == null) {
adView.getStarRatingView().setVisibility(View.INVISIBLE);
} else {
((RatingBar) adView.getStarRatingView())
.setRating(nativeAd.getStarRating().floatValue());
adView.getStarRatingView().setVisibility(View.VISIBLE);
}
if (nativeAd.getAdvertiser() == null) {
adView.getAdvertiserView().setVisibility(View.INVISIBLE);
} else {
((TextView) adView.getAdvertiserView()).setText(nativeAd.getAdvertiser());
adView.getAdvertiserView().setVisibility(View.VISIBLE);
}
// Assign native ad object to the native view.
adView.setNativeAd(nativeAd);
}
}
UnifiedNativeAdViewHolder.java
public class UnifiedNativeAdViewHolder extends RecyclerView.ViewHolder {
private UnifiedNativeAdView adView;
public UnifiedNativeAdView getAdView() {
return adView;
}
UnifiedNativeAdViewHolder(View view) {
super(view);
adView = (UnifiedNativeAdView) view.findViewById(R.id.ad_view);
// The MediaView will display a video asset if one is present in the ad, and the
// first image asset otherwise.
adView.setMediaView((MediaView) adView.findViewById(R.id.ad_media));
// Register the view used for each individual asset.
adView.setHeadlineView(adView.findViewById(R.id.ad_headline));
adView.setBodyView(adView.findViewById(R.id.ad_body));
adView.setCallToActionView(adView.findViewById(R.id.ad_call_to_action));
adView.setIconView(adView.findViewById(R.id.ad_icon));
adView.setPriceView(adView.findViewById(R.id.ad_price));
adView.setStarRatingView(adView.findViewById(R.id.ad_stars));
adView.setStoreView(adView.findViewById(R.id.ad_store));
adView.setAdvertiserView(adView.findViewById(R.id.ad_advertiser));
}
}