2017-07-12 19 views
9

लोड करने से पहले खाली स्थान प्रदर्शित करता है मैंने अपने आवेदन में Admob मूल विज्ञापन लागू किया है। इसे मेरे रेसीलर व्यू में प्रत्येक 4 आइटम के लिए एक बार प्रदर्शित करने के लिए रखा गया है। विज्ञापन प्रदर्शित होने से पहले समस्या है, विज्ञापन लोड होने के दौरान लगभग 3 से 5 सेकंड तक रिक्त स्थान दिखाई देगा। मुझे इस रिक्त स्थान को हटाने और विज्ञापन को केवल रीसाइक्लिंग व्यू आइटम्स के बीच लोड करने में सहायता चाहिए जब मूल विज्ञापन पूरी तरह से लोड हो। मैंने विज्ञापनों को प्रदर्शित करने से पहले और बाद में नीचे एक स्क्रीनशॉट संलग्न किया है।एक Recylerview के अंदर Admob मूल विज्ञापन

enter image description here enter image description here

एडाप्टर कोड के नीचे की तरह दिखता है।

public class MovieAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
private Context mContext; 
private List<Movie> mList; 
private LayoutInflater mLayoutInflater; 

private static final int DEFAULT_VIEW_TYPE = 1; 
private static final int NATIVE_AD_VIEW_TYPE = 2; 


public MovieAdapter(Context c, List<Movie> l) { 
    this(c, l, true, true); 
} 

public MovieAdapter(Context c, List<Movie> l, boolean wa, boolean wcl) { 
    mContext = c; 
    mList = l; 

    mLayoutInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

} 

@Override 
public int getItemViewType(int position) { 

     if (position!=0 && position%4 == 0) { 
      return NATIVE_AD_VIEW_TYPE; 
     } 
     return DEFAULT_VIEW_TYPE; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v; 
    switch (viewType) { 
     default: 
      v = mLayoutInflater.inflate(R.layout.item_movie_card, viewGroup, false); 
      return new MyViewHolder(v); 
     case NATIVE_AD_VIEW_TYPE: 
      v = mLayoutInflater.inflate(R.layout.list_item_native_ad, viewGroup, false); 
      return new NativeAdViewHolder(v); 


    } 


} 


@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    if (!(holder instanceof MyViewHolder)) { 
     return; 
    } 
    MyViewHolder myViewHolder = (MyViewHolder) holder; 

    myViewHolder.tvName.setText(mList.get(position).getName()); 
    myViewHolder.tvGenre.setText(mList.get(position).getGenre()); 


    ControllerListener listener = new BaseControllerListener() { 
     @Override 
     public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) { 
      super.onFinalImageSet(id, imageInfo, animatable); 
     } 

     @Override 
     public void onFailure(String id, Throwable throwable) { 
      super.onFailure(id, throwable); 
     } 

     @Override 
     public void onIntermediateImageFailed(String id, Throwable throwable) { 
      super.onIntermediateImageFailed(id, throwable); 
     } 

     @Override 
     public void onIntermediateImageSet(String id, Object imageInfo) { 
      super.onIntermediateImageSet(id, imageInfo); 
     } 

     @Override 
     public void onRelease(String id) { 
      super.onRelease(id); 
     } 

     @Override 
     public void onSubmit(String id, Object callerContext) { 
      super.onSubmit(id, callerContext); 
     } 
    }; 

    int w = 0; 
    if (myViewHolder.ivMovie.getLayoutParams().width == FrameLayout.LayoutParams.MATCH_PARENT 
      || myViewHolder.ivMovie.getLayoutParams().width == FrameLayout.LayoutParams.WRAP_CONTENT) { 

     Display display = ((Activity) mContext).getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 

     try { 
      w = size.x; 
     } catch (Exception e) { 
      w = display.getWidth(); 
     } 
    } 

    Uri uri = Uri.parse(DataUrl.getUrlCustom(mList.get(position).getUrlPhoto(), w)); 
    DraweeController dc = Fresco.newDraweeControllerBuilder() 
      .setUri(uri) 
      .setTapToRetryEnabled(true) 
      .setControllerListener(listener) 
      .setOldController(myViewHolder.ivMovie.getController()) 
      .build(); 

    myViewHolder.ivMovie.setController(dc); 

} 

@Override 
public int getItemCount() { 
    return mList.size(); 
} 


public void addListItem(Movie c, int position) { 
    mList.add(c); 
    notifyItemInserted(position); 
} 

public void removeListItem(int position) { 
    mList.remove(position); 
    notifyItemRemoved(position); 

} 


public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    public SimpleDraweeView ivMovie; 
    public TextView tvName; 
    public TextView tvGenre; 
    public ImageButton imageButton; 

    public MyViewHolder(View itemView) { 
     super(itemView); 

     ivMovie = (SimpleDraweeView) itemView.findViewById(R.id.iv_car); 
     tvName = (TextView) itemView.findViewById(R.id.tv_model); 
     tvGenre = (TextView) itemView.findViewById(R.id.tv_brand); 
     imageButton = (ImageButton) itemView.findViewById(R.id.like_button); 
    } 


    @Override 
    public void onClick(View v) { 


    } 
} 

public class NativeAdViewHolder extends RecyclerView.ViewHolder { 

    private final NativeExpressAdView mNativeAd; 

    public NativeAdViewHolder(final View itemView) { 
     super(itemView); 
     mNativeAd = (NativeExpressAdView) itemView.findViewById(R.id.nativeAd); 
     mNativeAd.setAdListener(new AdListener() { 
      @Override 
      public void onAdLoaded() { 
       super.onAdLoaded(); 
      } 

      @Override 
      public void onAdClosed() { 
       super.onAdClosed(); 
      } 

      @Override 
      public void onAdFailedToLoad(int errorCode) { 
       super.onAdFailedToLoad(errorCode); 
      } 

      @Override 
      public void onAdLeftApplication() { 
       super.onAdLeftApplication(); 

      } 

      @Override 
      public void onAdOpened() { 
       super.onAdOpened(); 

      } 
     }); 

     AdRequest adRequest = new AdRequest.Builder() 
       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
       .build(); 

     mNativeAd.loadAd(adRequest); 
    } 
} 

}

native_ad XML लेआउट फ़ाइल नीचे की तरह दिखता है।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:ads="http://schemas.android.com/apk/res-auto" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="132dp"> 

<com.google.android.gms.ads.NativeExpressAdView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/nativeAd" 
    ads:adSize="FULL_WIDTHx132" 
    ads:adUnitId="@string/native_ad_unit"/> 

+0

एक ही समस्या का सामना कर रहे हैं, तो आप मुझे अपने एडाप्टर को अपडेट करने के लिए बस कॉल करें, क्या आप मुझे यह बता सकते हैं कि आपने खंड में मूल एक्सप्रेस विज्ञापन दृश्य कैसे जोड़ा – shobhan

उत्तर

2

आप अपने native_ad.xml सिर्फ एक खाली LinearLayout शामिल है और लेआउट के लिए गतिशील रूप से NativeExpressAdView जोड़ने एक बार विज्ञापन भरी हुई है सकते हैं।

native_ad.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"/> 

गतिशील NativeExpressAdView की एक वस्तु बना सकते हैं और लेआउट केवल एक बार विज्ञापन भरी हुई है में जोड़ें।

public class NativeAdViewHolder extends RecyclerView.ViewHolder { 

    private final LinearLayouot containerView; 

    public NativeAdViewHolder(final View itemView) { 
     super(itemView); 
     containerView = itemView; 
     NativeExpressAdView mNativeAd = new NativeExpressAdView(itemView.getContext()); 
     mNativeAd.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
     mNativeAd.setId(R.id.nativeAd); 
     mNativeAd.setAdSize(new AdSize(AdSize.FULL_WIDTH, 132)); 
     mNativeAd.setAdUnitId("yourAdUnitId"); 
     mNativeAd.setAdListener(new AdListener() { 
      @Override 
      public void onAdLoaded() { 
       super.onAdLoaded(); 
       containerView.addView(mNativeAd); 
      } 

      ...All other overriden methods 
     }); 

     AdRequest adRequest = new AdRequest.Builder() 
       .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
       .build(); 

     mNativeAd.loadAd(adRequest); 
    } 
} 
1

मैं पहले से विज्ञापन लोड हो रहा है और रिजर्व में उनमें से एक कतार बनाए रखने, तो आप सिर्फ एक पूरी तरह से लोड विज्ञापन RecyclerView में नहीं बल्कि इंतजार कर की तुलना में पॉप कर सकते हैं सलाह देते हैं।

ऐसा करने के लिए हमारे Native Express RecyclerView example पर एक नज़र डालें।

+0

हाँ मैंने कोड को संदर्भित किया है और वे सूची का उपयोग करते हैं जहां मैं पूरी परियोजना में सूची का उपयोग करता हूं। तो सूची सूची सूची में नहीं बदलकर इसका कोई तरीका है? – SRBhagwat

+1

अब मृत लिंक ... –

6

आप यदि आप इसी तरह से आवश्यकता मैं इसे आप मदद कर सकते हैं उम्मीद है कि के रूप में onadfailedtoload में क्या गतिशील

public NativeAdViewHolder(final View itemView) { 
    super(itemView); 
    itemView.setVisibility(View.GONE); 
    mNativeAd = (NativeExpressAdView) itemView.findViewById(R.id.nativeAd); 
    mNativeAd.setAdListener(new AdListener() { 
     @Override 
     public void onAdLoaded() { 
      super.onAdLoaded(); 
      itemView.setVisibility(View.VISIBLE); 
     } 

     @Override 
     public void onAdClosed() { 
      super.onAdClosed(); 
     } 

     @Override 
     public void onAdFailedToLoad(int errorCode) { 
      super.onAdFailedToLoad(errorCode); 
     } 

     @Override 
     public void onAdLeftApplication() { 
      super.onAdLeftApplication(); 

     } 

     @Override 
     public void onAdOpened() { 
      super.onAdOpened(); 

     } 
    }); 

जोड़ने नहीं कर रहे हैं देखने के दृश्यता सेट तक यह भरा हुआ हो सकता है।

+0

यह काम नहीं कर रहा है। अभी भी एक ही मुद्दा है। – SRBhagwat

0

अपने माता पिता के कंटेनर अर्थात आपकी गतिविधि या टुकड़ा में अपना विज्ञापन लोड निर्माता का उपयोग कर recyclerview में अपने आइटम लोड हो रहा है पर विचार करें और बाद में। एक बार जब आप विज्ञापन डाउनलोड कर लें तो अपने एडाप्टर में updateRecyclerView(NativeAd ad_loaded){ // Now here add this ad in your list and call notifyDataSetChanged() here }

संबंधित मुद्दे