[英]AdMob Overlaying Recyclerview List Item
我在Recycler列表視圖中添加了Admob Banner,但是廣告覆蓋了列表項。 我一直在尋找解決此問題的方法,最近的方法是在Recyclerview中嵌入廣告
我嘗試了本文提供的幾種答案,但均未成功。 標語添加始終覆蓋列表項。 從下圖可以看到,有五個游戲,第4個游戲應顯示在橫幅廣告下方。
有人可以幫我解決此問題。 我在下面放置了我的適配器的代碼。
private List<Game> gameList;
private Activity gamesActivity;
private LayoutInflater inflater;
private static final int CONTENT_TYPE = 1;
private static final int AD_TYPE = 0;
private static final int AD_DELTA = 3;
public void notifyDatasetChanged(List<Game> newGamelist) {
gameList.clear();
gameList.addAll(newGamelist);
super.notifyDataSetChanged();
}
class MyViewHolder extends RecyclerView.ViewHolder {
private TextView gameLeagueId;
private TextView gameBowlerId;
private TextView gameSeriesId;
private TextView gameName;
private TextView score;
private TextView strikes;
private TextView spares;
private TextView splits;
private TextView splitConversions;
private TextView openFrames;
private TextView timestamp;
public TextView buttonViewOptions;
public MyViewHolder(View view) {
super(view);
if (!(itemView instanceof AdView)) {
gameLeagueId = view.findViewById( R.id.tvLeagueId );
gameBowlerId = view.findViewById( R.id.tvBowlerId );
gameSeriesId = view.findViewById( R.id.tvSeriesId );
gameName = view.findViewById(R.id.tvGameName);
score = view.findViewById( R.id.tvScore );
strikes = view.findViewById( R.id.tvStrikes );
spares = view.findViewById( R.id.tvSpares );
splits = view.findViewById( R.id.tvSplits );
splitConversions = view.findViewById( R.id.tvSplitConversions );
openFrames = view.findViewById( R.id.tvOpenFrames );
timestamp = view.findViewById( R.id.timestamp );
buttonViewOptions = view.findViewById(R.id.buttonViewOptions);
}
}
}
GamesAdapter(Context context, List<Game> gameList) {
this.context = context;
this.gameList = gameList;
gamesActivity = (Activity) context;
inflater = LayoutInflater.from(context);
}
@Override
public GamesAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
AdView adview;
GamesAdapter.MyViewHolder holder;
if (viewType == AD_TYPE) {
adview = new AdView(gamesActivity);
adview.setAdSize( AdSize.BANNER);
// this is the good adview
adview.setAdUnitId(gamesActivity.getString(R.string.admob_ad_id));
float density = gamesActivity.getResources().getDisplayMetrics().density;
int height = Math.round(AdSize.BANNER.getHeight() * density);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, height);
adview.setLayoutParams(params);
// dont use below if testing on a device
// follow https://developers.google.com/admob/android/quick-start?hl=en to setup testing device
AdRequest request = new AdRequest.Builder().build();
if (request != null && adview != null) {
adview.loadAd(request);
}
holder = new MyViewHolder(adview);
}else{
View view = inflater.inflate(R.layout.listview_games, parent, false);
holder = new MyViewHolder(view);
}
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
if (getItemViewType(position)==CONTENT_TYPE) {
Game game = gameList.get( position );
int id = game.getId();
String leagueId = game.getLeagueId();
String bowlerId = game.getBowlerId();
String seriesId = game.getSeriesId();
String gameNumber = String.valueOf(position+1);
holder.gameLeagueId.setText( game.getLeagueId() );
holder.gameBowlerId.setText( game.getBowlerId() );
holder.gameSeriesId.setText( game.getSeriesId() );
holder.gameName.setText(String.format("Game %s",gameNumber));
holder.score.setText( game.getScore() );
if (game.getStrikes() == "1") {
holder.strikes.setText( String.format( "%s Strike ", game.getStrikes()));
} else holder.strikes.setText( String.format( "%s Strikes", game.getStrikes()));
if (game.getSpares() == "1") {
holder.spares.setText( String.format( "%s Spare ", game.getSpares()));
} else holder.spares.setText( String.format( "%s Spares", game.getSpares()));
if (game.getSplits() == "1") {
holder.splits.setText( String.format( "%s Split ", game.getSplits()));
} else holder.splits.setText( String.format( "%s Splits", game.getSplits()));
if (game.getSplitConversions() == "1") {
holder.splitConversions.setText( String.format( "%s Split Conversion", game.getSplitConversions()));
} else holder.splitConversions.setText( String.format( "%s Split Conversions", game.getSplitConversions()));
if (game.getOpenFrames() == "1") {
holder.openFrames.setText( String.format( "%s Open Frame", game.getOpenFrames()));
} else holder.openFrames.setText( String.format( "%s Open Frames", game.getOpenFrames()));
// Formatting and displaying timestamp
holder.timestamp.setText( formatDate( game.getTimestamp() ) );
holder.buttonViewOptions.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
//creating a popup menu
PopupMenu popup = new PopupMenu( context, holder.buttonViewOptions );
//inflating menu from xml resource
popup.inflate( R.menu.series_options_menu );
//adding click listener
popup.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.profile:
((GamesActivity) context).openDialog( true, gameList.get( position ), leagueId, bowlerId, seriesId, position );
break;
case R.id.delete:
((GamesActivity) context).deleteGame( position );
break;
}
return false;
}
} );
//displaying the popup
popup.show();
}
} );
}
}
@Override
public int getItemCount() {
return gameList.size();
}
//Formatting TimeStamp to 'EEE MMM dd yyyy (HH:mm:ss)'
//Input : 2018-05-23 9:59:01
//Output : Wed May 23 2018 (9:59:01)
private String formatDate(String dateStr) {
try {
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = fmt.parse(dateStr);
SimpleDateFormat fmtOut = new SimpleDateFormat("EEE MMM dd yyyy (HH:mm:ss)");
return fmtOut.format(date);
} catch (ParseException ignored) {
}
return "";
}
@Override
public int getItemViewType(int position) {
if (position > 0 && position % AD_DELTA == 0) {
return AD_TYPE;
}
return CONTENT_TYPE;
}
將對象列表傳遞到回收器視圖時,它期望使用單個模型 (單個對象類型)。 在您的情況下,您正在傳遞Game對象。
假設您有一個包含5個對象的列表(如您的示例所示)。構建支架時,您將用AD_VIEW替換第四個對象,而不是為第四個對象構建支架。
解決方案1:將AdView添加到您的布局中,其可見性= GONE當位置變量滿足要求時,將可見性設置為VISIBLE。
解決方案2:創建一個看起來像這樣的包裝對象:
public class Wrapper{
public Game game;
public boolean isAd;
}
並將物體傳遞到您想要的位置。 因此,在該示例的情況下,您應該傳遞5個包裝器對象,其中分配了一個游戲對象,第6個包裝器對象位於您希望的位置,位置為isAd = true和game = null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.