我想在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);
}
});
答案 0 :(得分:6)
改进:
当用户尝试滚动时,请勿尝试加载Adview。要做到这一点,你的适配器recylerView滚动意识,然后检查是否
scroll_state==RecylerView.Scroll_IDLE
,然后只加载您的AdView。
如果您的所有adView都具有相同的宽度和高度,请不要在每次用户滚动时对其进行计算,请将其缓存在变量中。
您可以在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);
}
@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>
这种方法可以减少电池消耗和资源消耗,您的应用程序将更加顺畅