簡體   English   中英

AdMob重疊式Recyclerview清單項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM