【问题标题】:Adding an Admob banner to a listview every X rows每 X 行向列表视图添加一个 Admob 横幅
【发布时间】:2023-03-24 07:47:02
【问题描述】:

我知道这个问题已经被问过很多次了。我在这里查看了很多关于stackover flow的票,我似乎找不到任何我能清楚理解的东西。我已经能够让 Admob 横幅出现在我的应用程序中,但我无法弄清楚如何将它放入我的列表视图中。非常感谢我的指点和/或帮助。

Putting an AdMob native ad in a listView

这是我希望横幅广告出现的适配器。

@Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        League league = leaguesList.get(position);



        if (position == 0) {
            // Create and return Ad View
            //int id = league.getId();
            //String leagueId = String.valueOf(id);
            //holder.id.setText(leagueId);
            holder.name.setText("BANNER GOES HERE");
        } else {
            // Create and return a normal View
            int id = league.getId();
            String leagueId = String.valueOf(id);
            holder.id.setText(leagueId);
            holder.name.setText(league.getName());
        }



        //Formatting And Displaying Timestamp
        holder.timestamp.setText(formatDate(league.getTimestamp()));
    }

这是我的横幅广告代码

// Initialize the Mobile Ads SDK

        //setContentView(R.layout.content_main);
        MobileAds.initialize(this,
                getString(R.string.admob_app_id));

        // Find Banner ad
        mAdView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        // Display Banner ad
        mAdView.loadAd(adRequest);
    }

我不确定如何将广告代码合并到视图支架中以使其正常工作。

再次感谢任何帮助。

联赛适配器代码(修改)

    public class LeagueAdapter extends RecyclerView.Adapter<LeagueAdapter.MyViewHolder> {

    private Context context;
    private List<League> leaguesList;

    public void notifyDatasetChanged(List<League> newleagueslist) {
        leaguesList.clear();
        leaguesList.addAll(newleagueslist);
        super.notifyDataSetChanged();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView name;
        private TextView leagueAverage;
        public TextView id;
        public TextView timestamp;

        public MyViewHolder(View view) {
            super(view);
            id = view.findViewById( R.id.tvLeagueId);
            name = view.findViewById(R.id.tvSeriesName );
            leagueAverage = view.findViewById(R.id.tvLeagueAverage);
            timestamp = view.findViewById(R.id.timestamp);
        }
    }


    public LeagueAdapter(Context context, List<League> leaguesList) {
        this.context = context;
        this.leaguesList = leaguesList;
    }

    public static class ViewHolderAdMob extends RecyclerView.ViewHolder {
        public AdView mAdView;
        public ViewHolderAdMob(View view) {
            super(view);
            mAdView = (AdView) view.findViewById(R.id.adView);
            AdRequest adRequest = new AdRequest.Builder()
                    .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                    .build();
            mAdView.loadAd(adRequest);
        }
    }

     @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //View itemView = LayoutInflater.from(parent.getContext())
        //        .inflate(R.layout.listview_league, parent, false);
        RecyclerView.ViewHolder viewHolder;
         viewHolder = null;
         LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        switch(viewType){
            case 1:{
                View v = inflater.inflate(R.layout.listview_league, parent, false);
                viewHolder = new MyViewHolder(v);
                break;
            }
            case 2:{
                View v = inflater.inflate(R.layout.listview_league_admob, parent, false);
                viewHolder = new ViewHolderAdMob(v);
               break;
          }
       }
       //return (MyViewHolder) itemView;

       return new MyViewHolder(viewHolder);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        //League league = leaguesList.get(position);

        League league1 = leaguesList.get(holder.getAdapterPosition());

        switch(holder.getItemViewType()){
            case 1:{
                MyViewHolder viewHolder = (MyViewHolder) holder;
                viewHolder.name.setText(league1.getName());
                viewHolder.timestamp.setText(formatDate(league1.getTimestamp()));
                break;
            }
            case 2:{
                break;
            }
        }

    }

    @Override
    public int getItemCount() {
        return leaguesList.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 e) {

        }

        return "";
    }
}

布局 XML

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:autofit="http://schemas.android.com/apk/res-auto"
    android:clickable="true"
    android:foreground="?attr/selectableItemBackground"
    android:paddingBottom="@dimen/dimen_10"
    android:paddingLeft="@dimen/activity_margin"
    android:paddingRight="@dimen/activity_margin"
    android:paddingTop="@dimen/dimen_10"
    android:focusable="true">

    <me.grantland.widget.AutofitTextView
        android:id="@+id/tvSeriesName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLines="2"
        android:singleLine="true"
        android:text="@string/leagueValue"
        android:textColor="?attr/colorText1"
        android:textSize="24sp"
        autofit:minTextSize="16sp" />

    <TextView
        android:id="@+id/tvLeagueAverage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/tvSeriesName"
        android:layout_marginStart="0dp"
        android:text="League Average: 300"
        android:textColor="#000000"
        android:textSize="18sp"
        android:visibility="gone" />

    <TextView
        android:id="@+id/timestamp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvSeriesName"
        android:layout_centerHorizontal="true"
        android:text="Fri May 18 2018"
        android:textColor="?attr/colorText1"
        android:textSize="10sp"
        android:visibility="gone" />

    <TextView
        android:id="@+id/tvLeagueId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@+id/tvSeriesName"
        android:layout_below="@+id/timestamp"
        android:text="TextView"
        android:textColor="?attr/colorText1"
        android:visibility="gone" />

    <!-- set Banner ad position in UI layout design -->
    <com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="false"
        android:layout_centerHorizontal="true"
        ads:adSize="BANNER"
        ads:adUnitId="@string/admob_banner_id" />

</RelativeLayout>

【问题讨论】:

    标签: java android android-listview admob


    【解决方案1】:

    我的想法是覆盖 getItemViewType 并返回另一种类型 对于每个偶数位置 (%)。

    onCreateViewHolder 中使用 viewType 来确定您将使用哪个 viewHolder。 您应该有两个具有不同布局的 viewHolder(或一个具有设置可见性)。 一个 viewHolder 将是您列表中的正常项目。 第二个将持有 adView。

    祝你好运

    【讨论】:

      【解决方案2】:

      这可以通过多种方式实现。最简单的一种是将 adview 添加到列表项布局本身中,并使其在 onBindViewHolder 中可见或不可见。您可以向 League 类添加一个额外的整数变量,例如“viewType”,以确定是要显示的实际行项目还是要显示的广告视图。在将列表传递给适配器之前,遍历列表并以您需要的时间间隔添加一个广告项目。然后您可以简单地检查 viewType 并显示或隐藏 adview 和实际行项内容。

      Activity / Fragment 内部(在将列表数据发送到 Adapters 构造函数之前)

      int interval = 0;
      for(League model : oldList){
         if(interval == 5){
            list.add(new League(1, param, param));
            interval = 0;
         }else{
            model.setType(0);
            interval ++;
         }
         list.add(model);
      }
      

      在上述代码之后设置适配器。

      您不必在 onBindViewHolder 中编写迭代代码。你的 onBindViewHolder 必须是这样的

      @Override
      public void onBindViewHolder(MyViewHolder holder, int position) {
          League league = leaguesList.get(position);
      
          if(league.getType() == 1){
              //Adview. Shoe Adview and hide item viewgroup / items
          }else{
              //Row item content. Hide Adview and show item viewgroup / items
          }
      }
      

      【讨论】:

      • 感谢您的回答。我已经在上面发布了我的完整适配器和 xml 代码。我尝试实施您的建议,但我仍然不确定如何正确实施它。我对 Android 编程还是很陌生。您能帮我完成这项工作吗?
      • @RobertVogl 更新了我的答案。如果您需要任何帮助,请检查并告诉我
      • 有几件事我正在努力拼凑。 1.list.add(new League(1, param, param));——parm、parm代表什么? 2. oldlist 是从哪里来的或者在哪里声明的?
      • @RobertVogl 1.这是将对象添加到您应该传递给适配器的列表中。我只是说你可以根据需要使用参数化构造函数,但是它在这个问题中没有任何作用(你可以以你喜欢的方式创建对象)。 2.- 这里的 oldList 代表你现在用来填充 recyclerview 的对象的实际列表。在该循环中,您必须手动将对象一一添加到新列表中。而且您必须将这个新列表传递给适配器而不是旧列表。只要在创建适配器时可以访问它,就可以按照现在的方式声明它。
      • 我已将修改后的 LeagueAdapter 放在上面。我不确定我是否走在正确的轨道上,但我认为是的。当我编译应用程序时,我得到的 ViewHolder 无法在 Build Output 屏幕中转换为 View。 Logcat 它告诉我以下内容,不太确定如何修复此错误。 java.lang.NullPointerException:尝试从字段'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' on a null object reference读取
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多