2016-07-21 13 views
5

Ich integrierte eine native Facebook-Anzeige in ein GridView. Für den Moment zeige ich Testanzeigen an. Es funktioniert gut außer demjenigen, der ein Video spielt.Facebook native Anzeigen in GridView: MediaView zeigt ein graues Rechteck an

Die MediaView spielt ein Video gut, wenn der Benutzer nicht mit der GridView interagiert. Wenn die GridView gescrollt wird, wird das Video angehalten und fortgesetzt, wenn die Anzeige wieder auf dem Bildschirm angezeigt wird.

Nachdem das Gitter nach oben scrollen und nach unten ein paar Mal, wird der Mediaview das Video mehr nicht zeigen, und zeigt einfach ein graues Rechteck.

Aus Neugier habe ich versucht, Ui Automatic Viewer auf meinem Gerät ausführen, wenn die MediaView grau ist. Ich habe etwas Interessantes bemerkt, aber ich kann nicht wirklich einen Sinn daraus ziehen.

In der View-Hierarchie kann ich die GridView mit einigen untergeordneten FrameLayout (Container für die vom Adapter angegebenen Ansichten) sehen. Dies umfasst die native Anzeige und die anderen Ansichten.

Aber , wenn die Mediaview grau ist, seine FrameLayout in der Ansicht Hierarchie erscheint nicht! Aber es ist gut auf dem Bildschirm wiedergegeben!

Ich bin sehr verwirrt von dem, was ich sehe.

Auch wenn ich diese Anzeigen in einem RecyclerView integriert hatte, hatte ich dieses Problem nicht (oder merkte es zumindest nicht).

Lassen Sie uns über den Code sprechen. Ich habe eine Referenz, die auf die native Anzeigenschaltung von Facebook zeigt.

Vorschläge willkommen :)

Hier ist der Code des Adapters ist, der Blick auf das Gridview liefert:

public class AdapterGridGallery extends BaseAdapter implements AdListener { 

    private static int POSITION_AD = 4; 
    private List<QuizzModel> listQuizzes; 

    int heightViews; 
    FragmentGallery fragmentGallery; 

    View facebookAdView; 
    private NativeAd facebookNativeAd; 
    private boolean nativeAdSet = false; 

    public AdapterGridGallery(FragmentGallery fragment, int height) { 
     heightViews = height; 
     fragmentGallery = fragment; 
     facebookNativeAd = new NativeAd(fragment.getContext(), "my_tag"); 
     facebookNativeAd.setAdListener(this); 
     facebookNativeAd.loadAd(); 
    } 

    public void updateData(List<QuizzModel> list) { 
     listQuizzes = list; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return listQuizzes != null ? listQuizzes.size() + 1 : 0; 
    } 

    @Override 
    public Object getItem(int i) { 
     return listQuizzes.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return listQuizzes.get(i).getId(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == POSITION_AD) 
      return 0; 
     else 
      return 1; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     View viewQuizz = null; 
     switch (getItemViewType(position)) { 
      case 0: 
       if (facebookAdView == null) { 
        facebookAdView = LayoutInflater.from(viewGroup.getContext()) 
          .inflate(R.layout.view_facebook_native, viewGroup, false); 
        //Settings the height of the view 
        AbsListView.LayoutParams params = (AbsListView.LayoutParams) facebookAdView.getLayoutParams(); 
        params.height = heightViews; 
        params.width = AbsListView.LayoutParams.MATCH_PARENT; 
        facebookAdView.setLayoutParams(params); 
       } 

       viewQuizz = facebookAdView; 
       viewQuizz.setTag(0); 

       if (facebookNativeAd.isAdLoaded()) { 
        if (!nativeAdSet) { 
         Log.d("NativeAdList", "update views resources"); 
         nativeAdSet = true; 

         ImageView nativeAdIcon = (ImageView) facebookAdView.findViewById(R.id.native_ad_icon); 
         TextView nativeAdTitle = (TextView) facebookAdView.findViewById(R.id.native_ad_title); 
         TextView nativeAdBody = (TextView) facebookAdView.findViewById(R.id.native_ad_body); 
         MediaView nativeAdMedia = (MediaView) facebookAdView.findViewById(R.id.native_ad_media); 
         TextView nativeAdSocialContext = (TextView) facebookAdView.findViewById(R.id.native_ad_social_context); 
         Button nativeAdCallToAction = (Button) facebookAdView.findViewById(R.id.native_ad_call_to_action); 


         nativeAdSocialContext.setText(facebookNativeAd.getAdSocialContext()); 
         nativeAdCallToAction.setText(facebookNativeAd.getAdCallToAction()); 
         nativeAdTitle.setText(facebookNativeAd.getAdTitle()); 
         nativeAdBody.setText(facebookNativeAd.getAdBody()); 
         // Downloading and setting the ad icon. 
         NativeAd.Image adIcon = facebookNativeAd.getAdIcon(); 
         NativeAd.downloadAndDisplayImage(adIcon, nativeAdIcon); 
         // Download and setting the cover image. 
         nativeAdMedia.setNativeAd(facebookNativeAd); 
         nativeAdMedia.setAutoplay(true); 
         facebookNativeAd.registerViewForInteraction(facebookAdView); 
         nativeAdCallToAction.setVisibility(View.VISIBLE); 
        } else { 
         Log.d("NativeAdList", "views resources already set"); 
        } 
       } else { 
        Log.d("NativeAdList", "nativeAdCallToAction is set invisible"); 
        nativeAdCallToAction.setVisibility(View.INVISIBLE); 
       } 
       break; 
      case 1: 
       view = new CustomView(); 
      } 
      return view; 
    } 

    @Override 
    public void onError(Ad ad, AdError adError) { 
    } 

    @Override 
    public void onAdLoaded(Ad ad) { 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void onAdClicked(Ad ad) { 

    } 
} 

Hier ist ein Screenshot von Ui Automator-Viewer.

enter image description here

Antwort

3

Wie Sie sagten

, wenn ich diese Anzeigen in einem RecyclerView integriert, habe ich dieses Problem nicht (oder zumindest nicht bemerken es nicht).

Ich interpretierte, dass Recycler Ansicht völlig in Ordnung für Sie arbeiten. Dann, anstatt zu versuchen, dasselbe in gridview zu wiederholen, verwenden Sie einfach LayoutManager, um die Recycleransicht als grid or list zu konvertieren.

+1

Ja, ich habe den GridLayoutManager verwendet, um eine ähnliche Anzeige zu erhalten. Die Sache ist, dass ich die RecyclerView "dynamisch" bevölkern muss (ich weiß nicht den Typ der Ansicht, die angezeigt werden soll, wenn ich mit dem Rendern der Liste anfange), also dachte ich, dass es auf den ersten Blick nicht möglich wäre, einen RecyclerView zu verwenden. Aber ich habe herausgefunden, wie es geht und vergiss das GridView. Also, eine mögliche Lösung für dieses Problem wäre die Verwendung eines RecyclerView anstelle eines ListView/GridView. – Gordak

+0

Plus Recyclerview wird über ListView/GridView empfohlen. Wenn das Ihr Problem gelöst hat, können wir diesen Thread schließen. –