由于Admob广告,Recyclerview在滚动上滞后

时间:2017-07-04 19:34:20

标签: android android-recyclerview admob android-cardview recycler-adapter

我想在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);
                }
            });

2 个答案:

答案 0 :(得分:6)

改进:

  1. 当用户尝试滚动时,请勿尝试加载Adview。要做到这一点,你的适配器recylerView滚动意识,然后检查是否 scroll_state==RecylerView.Scroll_IDLE,然后只加载您的AdView。

  2. 如果您的所有adView都具有相同的宽度和高度,请不要在每次用户滚动时对其进行计算,请将其缓存在变量中。

  3. 您可以在item_view中使用XML版本,而不是动态添加和删除NativeExpressAdView。您可以根据条件隐藏和显示。在XML视图中设置所有可能的必需属性。

答案 1 :(得分:0)

为每个视图持有者创建一个新的AdView将非常耗费资源。

不是在每个视图持有者上创建新的广告视图,而是在某个时间间隔之后对广告视图进行充气,例如在每5或10个项目之后。

  • 创建两个不同的布局,用于带广告的适配器1和没有广告的适配器。

  • 覆盖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>

这种方法可以减少电池消耗和资源消耗,您的应用程序将更加顺畅