2016-07-21 12 views
5

Zintegrowam natywną reklamę Facebooka z GridView. Na razie wyświetlam reklamy testowe. Działa dobrze, z wyjątkiem tego, który odtwarza wideo.Natywne reklamy Facebooka w GridView: MediaView wyświetla szary prostokąt

Odtwarzanie wideo jest w porządku, jeśli użytkownik nie wchodzi w interakcję z GridView. Po przewinięciu widoku GridView wideo jest wstrzymywane i wznawiane po ponownym wyświetleniu reklamy na ekranie.

Po przewijanie w górę iw dół siatki kilka razy z MediaView nie pokazuje film już i po prostu wyświetla szary prostokąt.

Z ciekawości próbowałem uruchomić na moim urządzeniu Ui Automatic Viewer, gdy MediaView jest szary. Zauważyłem coś interesującego, ale nie mogę zrozumieć.

W hierarchii widoku widzę GridView z niektórymi dziećmi FrameLayout (kontener dla widoków przekazanych przez adapter). Obejmuje to reklamę natywną i inne widoki.

Ale gdy MediaView jest szary, jego FrameLayout nie są wyświetlane w widoku hierarchii! Ale na ekranie jest dobrze!

Jestem bardzo zaintrygowany tym, co widzę.

Ponadto, gdy włączyłem te reklamy w oknie RecyclerView, nie miałem tego problemu (a przynajmniej go nie zauważyłem).

Porozmawiajmy o kodzie. Mam referencję, która wskazuje na natywną reklamę Facebooka Zobacz.

sugestie mile widziane :)

Oto kod z adapterem, który dostarcza widoków do GridView:

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) { 

    } 
} 

Oto zrzut ekranu z Ui Automator Viewer.

enter image description here

Odpowiedz

3

Jak powiedział

kiedy włączone te reklamy w RecyclerView, nie mają tego problemu (lub przynajmniej nie zauważyłem).

Zinterpretowałem, że widok recyklera działa doskonale dla Ciebie. Następnie zamiast próbować zmienić to samo w widoku siatki, po prostu użyj LayoutManager, aby przekonwertować widok recyklingu jako grid or list.

+1

Tak Użyłem GridLayoutManager, aby uzyskać podobny ekran. Chodzi o to, że muszę zasypać "RecyclerView" "dynamicznie" (nie wiem, jaki typ widoku powinien być wyświetlany, kiedy zaczynam renderować listę), więc na pierwszy rzut oka wydawało mi się, że nie będzie możliwe użycie RecyclerView. Ale wymyśliłem, jak to zrobić i po prostu zapomnieć o GridView. Więc tak, możliwym rozwiązaniem tego problemu byłoby użycie RecyclerView zamiast ListView/GridView. – Gordak

+0

Plus Podgląd recycler jest zalecany w stosunku do ListView/GridView. Jeśli to rozwiązało twój problem, możemy zamknąć ten wątek. –

Powiązane problemy