2016-07-21 10 views
5

मैंने एक फेसबुक मूल विज्ञापन को ग्रिड व्यू में एकीकृत किया। अभी के लिए, मैं परीक्षण विज्ञापन प्रदर्शित करता हूं। एक वीडियो चलाने के अलावा यह ठीक काम करता है।ग्रिड व्यू में फेसबुक मूल विज्ञापन: मीडिया व्यू एक ग्रे आयताकार प्रदर्शित करता है

MediaView वीडियो को ठीक से चलाता है यदि उपयोगकर्ता ग्रिड व्यू के साथ इंटरैक्ट नहीं करता है। जब ग्रिडव्यू स्क्रॉल किया जा रहा है, तो वीडियो को तब स्क्रीन पर फिर से दिखाई देने पर रोका और फिर से शुरू किया जाता है।

कई बार ग्रिड को स्क्रॉल और नीचे के बाद, MediaView वीडियो अब प्रदर्शित नहीं करता है और बस एक धूसर आयत प्रदर्शित करता है।

जिज्ञासा से, मैंने MediaView ग्रे होने पर अपने डिवाइस पर Ui Automatic Viewer चलाने की कोशिश की। मैंने कुछ दिलचस्प देखा लेकिन मैं वास्तव में समझ में नहीं आता।

दृश्य पदानुक्रम में, मैं कुछ बच्चों के साथ GridView (Adapter द्वारा दिए गए दृश्यों के लिए कंटेनर) के साथ ग्रिड व्यू देख सकता हूं। इसमें मूल विज्ञापन और अन्य विचार शामिल हैं।

लेकिन जब MediaView ग्रे है, इसका FrameLayout देखें पदानुक्रम में प्रकट नहीं होता! लेकिन यह स्क्रीन पर बस ठीक है!

मैं जो देखता हूं उससे बहुत परेशान हूं।

साथ ही, जब मैंने इन विज्ञापनों को रीसाइक्लिंग व्यू में एकीकृत किया, तो मुझे यह समस्या नहीं थी (या कम से कम इसे नोटिस नहीं किया गया था)।

चलिए कोड के बारे में बात करते हैं। मेरे पास एक संदर्भ है जो फेसबुक मूल विज्ञापन दृश्य पर इंगित करता है।

सुझाव का स्वागत करते हैं :)

यहाँ एडाप्टर 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) { 

    } 
} 

यहाँ Ui स्वचालक व्यूअर का एक स्क्रीनशॉट है।

enter image description here

उत्तर

3

जैसा कि आपने कहा

जब मैं एक RecyclerView में इन विज्ञापनों एकीकृत, मैं इस समस्या नहीं था (या कम से कम यह नोटिस नहीं किया था)।

मैंने व्याख्या की कि रीसाइक्लिंग व्यू आपके लिए पूरी तरह से ठीक काम करता है। फिर ग्रिडव्यू में एक ही चीज़ को फिर से करने की कोशिश करने के बजाय रीसाइक्लर व्यू को grid or list के रूप में परिवर्तित करने के लिए बस LayoutManager का उपयोग करें।

+1

हां मैंने समान प्रदर्शन प्राप्त करने के लिए ग्रिडलेआउट प्रबंधक का उपयोग किया था। बात यह है कि मुझे रीसाइक्लिंग व्यू को "गतिशील रूप से" बनाना चाहिए (जब मैं सूची प्रस्तुत करना शुरू करता हूं तो मुझे प्रदर्शित करने के लिए दृश्य के प्रकार को नहीं पता), इसलिए पहली नज़र में मैंने सोचा कि रीसाइक्लिंग व्यू का उपयोग करना संभव नहीं होगा। लेकिन मुझे पता चला कि इसे कैसे किया जाए और केवल ग्रिड व्यू के बारे में भूल जाएं। तो हाँ, इस समस्या का एक संभावित समाधान ListView/GridView के बजाय एक RecyclerView का उपयोग करना होगा। ListView/GridView पर – Gordak

+0

प्लस रीसाइक्लिंगव्यू की अनुशंसा की जाती है। अगर इससे आपकी समस्या हल हो जाती है तो हम इस धागे को बंद कर सकते हैं। –