ネイティブ広告でRecyclerViewを友達に
 以前の経験が良好であることが判明したため、 RecyclerViewの場合、彼らはアダプターのラッパー(以下、ラッパーと呼ぶ)を実装することにしました。 これにより、開発者はデータ用に独自の特別でユニークなアダプターを作成でき、この取り組みを妨げないようにしています。 次に、開発者は依存性注入を使用してラッパーをアダプターに関連付け、 RecyclerViewでラッパー参照を渡します。 したがって、アダプターロジックに干渉しません。 コレクションを表示するとき、ラッパーは広告ユニットを表示する場所とソースデータを計算します。 検討中のライブラリの一部にはエレガントなソリューションや革新的なデザインが含まれていないため、 ListViewの RecyclerViewのスクロール可能なネイティブ広告の実装の機能と違いについて詳しく説明します。  RecyclerViewのアダプタ基本クラスはRecyclerView.Adapter <〜>であり、 ListViewの場合はBaseAdapterです。  ListViewのViewHolder -patternのアプリケーションがbest-practicesのカテゴリからのアクションである場合、 RecyclerView.Adapter <VH extends RecyclerView.ViewHolder> 宣言では、ViewHolderタイプパラメーターが必要です。 基本クラスにはメソッドのオーバーライドが必要です 
      abstract int getItemCount()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      アダプタによって保存されたアイテムの総数を返します。 本質的にint getCount()に似ています。 
       abstract void onBindViewHolder(VH holder, int position)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
       ホルダーに保存されたビューを、 位置インデックスで取得されたデータ収集要素にバインドします。 このメソッドと次のメソッドは、BaseAdapterからView getViewメソッド(int位置、View convertView、ViewGroup親)を「置換」するために、以前に、 convertViewのnullのチェック結果に応じて、新しいconvertViewを作成するか、現在のデータを対応するデータにバインドしました。 
       abstract VH onCreateViewHolder(ViewGroup parent, int viewType)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      目的のタイプviewTypeのビュー ホルダーを作成して返します。 特定の属性に応じてコレクションの要素をさまざまな方法で表示する必要がある場合は、 viewTypeコンテナタイプを使用する必要があります。 この場合、メソッドも定義する必要があります 
       int getItemViewType(int position)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
       位置インデックスにあるデータコレクションアイテムのコンテナタイプを返します。  BaseAdapterの場合 、 getViewTypeCountメソッドでコンテナタイプの合計数を決定することも必要でした。RecyclerView.Adapter <〜>では、これは不要になりました。 この例では、 getViewTypeCountはラッパーで 3を返します 。元のデータコレクション(アダプター用)からの要素用に1つ、コンテンツを使用した広告およびアプリケーションのインストール用の広告用に2つです(前の記事を参照)。 同時に、アダプターはコンテナータイプを表示するための独自のロジックを決定でき、ラッパーはそれについて何も知る必要がありません。 だから、ソースコードは千語よりも優れています:) 
        展開する 
        
        
        
      
    
        public class AdmobRecyclerAdapterWrapper<T, V extends View> extends RecyclerView.Adapter<ViewWrapper<V>> implements AdmobFetcher.AdmobListener { //... @Override public void onBindViewHolder(ViewWrapper<V> viewHolder, int position) { if (viewHolder==null) return; switch (viewHolder.getItemViewType()) { //  -    case VIEW_TYPE_AD_INSTALL: //  viewHolder.getView()     (recycling) NativeAppInstallAdView lvi1 = (NativeAppInstallAdView) viewHolder.getView(); //   . getItem      AdmobFetcher  ,      . NativeAppInstallAd ad1 = (NativeAppInstallAd) getItem(position); //    AdViewHelper.bindInstallAdView(lvi1, ad1); break; //  -    case VIEW_TYPE_AD_CONTENT: NativeContentAdView lvi2 = (NativeContentAdView) viewHolder.getView(); NativeContentAd ad2 = (NativeContentAd) getItem(position); AdViewHelper.bindContentAdView(lvi2, ad2); break; default: //     (   ),    (  ) int origPos = getOriginalContentPosition(position); //    mAdapter.onBindViewHolder(viewHolder, origPos); } } @Override public final ViewWrapper<V> onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_AD_INSTALL: case VIEW_TYPE_AD_CONTENT: //  viewholder    viewType -     return new ViewWrapper<V>(onCreateItemView(parent, viewType)); default: //     return mAdapter.onCreateViewHolder(parent, viewType); } } //        (.    ) private V onCreateItemView(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_AD_INSTALL: NativeAppInstallAdView lvi1 = getInstallAdView(parent); return (V)lvi1; case VIEW_TYPE_AD_CONTENT: NativeContentAdView lvi2 = getContentAdView(parent); return (V)lvi2; default: return null; } } //      ,    //... }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      ちょっとした官僚主義
記事の冒頭で、Admobからのネイティブ広告に関する公式ドックの説明に言及しましたが、主な変更点の1つは公開ルールです。 一般的に、ネイティブ広告を統合するプロセスは次のようになります(間違えた場合は修正してください)。
- アプリケーションのテストバージョンの実装前でも、将来の広告のモックアップおよびUIでのプレゼンテーションについて、アカウントマネージャーから開発および承認を得る(任意)
 - 閉じたモードで、テストadmob発行IDを使用して広告テンプレートをテストする
 - テンプレートおよび配置ルールですべてが正常であることの公式承認を取得します。 この手順は、アルファ/ベータテストモードの開発者コンソールから、またはadmobダッシュボードから直接利用できるようにすることをお勧めします
 - 承認済みアプリケーションを公開
 
UIでの広告の外観の正式なチェックは、既に公開されているチェックリストに従って実行されます。
また、 developer-guideにコメントが追加されました。その本質は、単一のAdLoaderオブジェクトのコンテキストでloadAdメソッドを呼び出すことにより、広告ユニットのマルチスレッドロードに対して開発者に警告することです。 つまり、基本的に、2つ以上のオプションが残っています:)
- loadAd呼び出しごとに個別のAdLoaderエンティティを作成します。
 - 単一のAdLoaderオブジェクトのコンテキストでloadAdを呼び出す前に、前のブロックの読み込みが完了したことを確認してください。
 
2番目のオプションの実装例は、再びadmobadapterライブラリで見ることができます( 正規性の主張なし)。 これらのメソッドは、前の記事ですでに詳細に説明されているため、 loadAd同期の原因となるAdmobFetcherコードフラグメントを検討します。 この目的でフラグが使用されます。
 AtomicBoolean lockFetch = new AtomicBoolean();
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
       loadAdを呼び出す前に、このフラグの値を確認し、trueに設定されている場合-別のブロックが現在ロード中の場合-終了します。 それ以外の場合は、trueに設定して、広告ユニットの読み込みを試みます 
        展開する 
        
        
        
      
    
 広告ユニットの読み込みを許可するには、フラグをfalseに設定する必要があります。これは、以下に示すように、 AdLoaderエンティティの作成時にloadAdが終了するようにサインアップすることで実行できます。 
        private synchronized void fetchAd() { Context context = mContext.get(); if (context != null) { if(lockFetch.getAndSet(true)) return; adLoader.loadAd(getAdRequest()); } else { mFetchFailCount++; } }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
        展開する 
        
        
        
      
    
        adLoader = new AdLoader.Builder(mContext.get(), admobUnitId) .forAppInstallAd(new NativeAppInstallAd.OnAppInstallAdLoadedListener() { @Override public void onAppInstallAdLoaded(NativeAppInstallAd appInstallAd) { lockFetch.set(false); //... } }) .forContentAd(new NativeContentAd.OnContentAdLoadedListener() { @Override public void onContentAdLoaded(NativeContentAd contentAd) { lockFetch.set(false); //... } }) .withAdListener(new AdListener() { @Override public void onAdFailedToLoad(int errorCode) { lockFetch.set(false); mFetchFailCount++; //... } }).build();
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      結論の代わりに
そのため、 RecyclerViewの新しいラッパーには変更が加えられています。
- データ/広告を表示するビューを作成する
 - データ/広告へのビューのバインド
 - 基本クラスの他の抽象メソッドをオーバーライドします。
 
以前のままでした:
- AdMobサーバーから広告をダウンロードするためのメカニズム( AdmobFetcherクラス)
 - 広告ビュー (xml)の構造とバインディングの充填
 - 原価計算インデックスと広告ユニット/データブロックの数
 - getItemCount() 、 getItemId(int position)およびgetItemViewType(int position)メソッドの本質は同じままですが、名前が変更されました。
 
記事の2番目の部分からの乾燥した残留物-Admobネイティブ広告の公式ドキュメントは、ネイティブ広告をアプリケーションに統合する手順が重要であり、費やされる時間は開発速度だけでなく中程度の速度にも依存することが示唆されるかのように開発を続けていますAdmob / Googleスタッフの十分性。
添付の投票に投票していただければ、統計に感謝します! 伝統的に、私たちはあなたのアプリケーションであなたに美しい広告を願っています!
PS:この記事の情報の一部は「わずかに」古いことが判明したため、新しいGoogleドキュメントsupport.google.com/admob/answer/6270315?hl=enへのリンクを提供します。 時間が来たら-Habréでの接続プロセスについて説明します。