Задержка recyclerview в прокрутке из-за рекламы Admob

Я хочу загружать рекламу в объявлениях RecyclerView, которые загружаются успешно, но это приводит к большому отставанию при прокрутке

Ниже приведен код, который я написал в методе OnBindViewHolder адаптера

Как исправить это отставание?

((DealHolder) holder).adcardView.post(new Runnable() { @Override public void run() { final NativeExpressAdView adView = new NativeExpressAdView(((DealHolder) holder).itemView.getContext()); final int adWidth = ((DealHolder) holder).adcardView.getWidth() - ((DealHolder) holder).adcardView.getPaddingLeft() - ((DealHolder) holder).adcardView.getPaddingRight(); final int adHeight = ((DealHolder) holder).adcardView.getHeight() - ((DealHolder) holder).adcardView.getPaddingBottom() - ((DealHolder) holder).adcardView.getPaddingTop(); final float scale = ((DealHolder) holder).adcardView.getResources().getDisplayMetrics().density; AdSize adSize = new AdSize((int) (adWidth / scale), (int) (adHeight / scale)); adView.setAdSize(adSize); adView.setAdUnitId(((DealHolder) holder).adcardView.getContext().getString(R.string.test_adunit_id)); AdRequest request = new AdRequest.Builder().addTestDevice("jjhjhbjhjhjhjhjhjhjh").build(); adView.loadAd(request); adView.setAdListener(new AdListener() { @Override public void onAdLoaded() { super.onAdLoaded(); } @Override public void onAdFailedToLoad(int i) { super.onAdFailedToLoad(i); } }); ((DealHolder) holder).adcardView.removeAllViews(); ((DealHolder) holder).adcardView.addView(adView); } }); 

Усовершенствования:

  1. Не пытайтесь загрузить свое объявление, когда пользователь пытается прокручивать. Для этого сделайте свой адаптер recylerView прокруткой, а затем проверьте, есть ли scroll_state==RecylerView.Scroll_IDLE , а затем загрузите AdView.

  2. Если все ваши adViews имеют одинаковую ширину и высоту, не вычисляйте его каждый раз, когда пользователь прокручивает, кешируйте его в переменной.

  3. Вместо динамического добавления и удаления NativeExpressAdView используйте XML-версию для этого в item_view. Вы можете скрывать и показывать на основе условий. Установите все необходимые атрибуты в представлении XML.

Создание нового AdView для каждого владельца будет довольно ресурсоемким.

Вместо того, чтобы создавать новое объявление на каждом держателе представления, раздуйте рекламный блок после определенного интервала, например, после каждых 5 или 10 позиций.

  • Создайте два разных макета для использования в адаптерах с объявлениями, а другой без рекламы.

  • Переопределить метод getItemViewType ()

public int getItemViewType(int position) { if (position % 10 == 0){ // Ad after every 10 items return 0; //use integer constant to identify view type is Adview. } return super.getItemViewType(position); }

  • В методе OnCreateViewHolder ()

    @Override public ViewHolderClass onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0){ // Constant for Adview View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_row_with_ads, parent,false); return new ViewHolderClass(view, viewType); } View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_row, parent,false); return new ViewHolderClass(view); }

  • В вашем ViewholderClass создайте второй конструктор с параметрами View и int

    public class ViewHolderClass extends RecyclerView.ViewHolder{ ... public ViewHolderClass(View view){ ... } public ViewHolderClass(View view, int viewType){ ... // Initialize your adview here }

  • Для ваших макетов. Если ваш adapter_row.xml выглядит так:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" > <android.support.v7.widget.CardView android:id="@+id/base" android:layout_width="match_parent" android:layout_height="wrap_content" > // your main content </android.support.v7.widget.CardView> </RelativeLayout> 
  • Затем создайте другой файл макета для адаптера adapter_row_with_ads.xml с этими изменениями.
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" > <android.support.v7.widget.CardView android:id="@+id/base" android:layout_width="match_parent" android:layout_height="wrap_content" > // your main content </android.support.v7.widget.CardView> <!--This is where you'll add your AdView--> <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/base"/> </RelativeLayout> 

Такой подход уменьшит дренаж батареи и потребление ресурсов, и ваше приложение будет более плавным

Я думаю, проблема заключается в том, что вы не используете основной поток для показа объявлений.

Я бы рекомендовал сделать это в onViewAttachedWindow . Потому что, когда функция запускалась, менеджер компоновки уже выполнял свой процесс, например, замедление и замену элементов и т. Д.

Таким образом, вам не нужно использовать другой поток, и основной поток не будет заблокирован, а recyclerview будет прокручиваться плавно.

Intereting Posts
Android: извлечение логарифма перед сбоем (перезагрузка) на реальном устройстве Активность мастера полноэкранного действия. Как отключить отображение панели действий при взаимодействии с устройством? Что конкретно делает аннотация Android @hide? Программно определить, разрешена ли установка из неизвестных источников Как добавить пробел между кнопками табуляции в Android? Android отображает различное изображение на разных разрешениях Как изменить имя и значок приложения Android во время выполнения? Значение Animator android Может ли ListView содержать фрагменты LinearLayout: layout_gravity = "bottom" не работает на горизонтальном LinearLayout Как удалить границу / тень с кнопок леденца Как получить версию приложения Как захватить экран с помощью / dev / graphics / fb0 (Android) Как изменить цвет акцента в оповещениях о материалах в Android? Android-устройство, не получающее многоадресный пакет