Добавление баннера Admob в просмотр списка каждые X строк - PullRequest
1 голос
/ 27 июня 2019

Я знаю, что этот вопрос задавался несколько раз.Я прошел через много билетов здесь на стеке потока, и я не могу найти что-то, что я могу ясно понять.Мне удалось отобразить баннер Admob в моем приложении, но я не могу понять, как включить его в мой список.Я буду очень благодарен за указатели и / или помощь.

Размещение нативной рекламы AdMob в 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>

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Этого можно достичь разными способами.Самый простой - это добавить объявление внутри самого макета элемента списка и сделать его видимым или невидимым из onBindViewHolder.Вы можете добавить дополнительную целочисленную переменную, скажем, «viewType», к порядку классов Лиги, чтобы определить, будет ли отображаться фактический элемент строки или показ рекламы.Прежде чем передать список адаптеру, выполните итерацию по списку и добавляйте элемент для рекламы с необходимыми вам интервалами.Затем вы можете просто проверить viewType и показать или скрыть содержание объявления и реального элемента строки.

Inside 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
    }
}
1 голос
/ 27 июня 2019

Моя идея - переопределить getItemViewType и возвращать другой тип для каждой четной позиции (%).

В onCreateViewHolder используйте viewType, чтобы определить, какой viewHolder вы собираетесь использовать.У вас должно быть два viewHolder с разными макетами (или один с установленной видимостью).Один viewHolder будет обычным элементом вашего списка.второй будет содержать adView.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...