由于Admob广告,Recyclerview滞后滚动
我想在RecyclerView广告中加载广告已成功加载,但它在滚动时滞后很多
以下是我在Adapter的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);
}
});
改进:
当用户尝试滚动时,不要尝试加载Adview。 要做到这一点,使您的适配器recylerView滚动察觉,然后检查scroll_state==RecylerView.Scroll_IDLE
,然后只加载您的AdView。
如果所有广告视图都具有相同的宽度和高度,则每次用户滚动时都不计算它,请将其缓存在变量中。
不要动态添加和删除NativeExpressAdView,请在item_view中为其使用XML版本。 您可以根据条件隐藏和显示。 在XML视图中设置所有可能的必需属性。
我认为问题在于您不使用主线程来显示广告。
我会建议在onViewAttachedWindow
执行此onViewAttachedWindow
。 因为当功能触发时,布局管理器已经有了它的过程,比如测量和替换项目等。
通过这种方式,您不需要使用其他线程,主线程也不会被阻止,并且recyclerview将顺利滚动。
为每个视图持有者创建一个新的AdView将会非常耗资源。
而不是在每个视图持有者上创建新的广告视图,在特定时间间隔后为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>
<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>
这种方法将减少电池排水和资源消耗,并且您的应用程序将更加流畅
链接地址: http://www.djcxy.com/p/39965.html