2016-06-19 3 views
6

लोड होने पर मूल एडी पूरी तरह से दिखाई देने के लिए स्क्रॉल करने के लिए स्क्रॉल करें, मेरे पास एक अजीब "समस्या" है या यह एक "फीचर" हो सकती है और मुझे नहीं पता, जब भी मेरे रीसाइक्लर व्यू में एक मूल एडेक्सप्रेस लोड होता है मूल एडी का हिस्सा दिखाई देता है, यह रीसाइक्लिंग व्यू को तब तक स्क्रॉल करने के लिए मजबूर करता है जब तक कि मूल विज्ञापन पूरी तरह दिखाई नहीं दे रहा है, यह व्यवहार स्क्रॉल के रूप में सूची को कूदने का कारण बनता है।NativeAdsExpress बलों रीसाइक्लर को पहली बार

मेरे लेआउट मुख्य रूप से है:

गतिविधि> टैब और ViewPager> पेजर में प्रत्येक पृष्ठ के साथ AppBar PullToRefresh होता है और अंदर यह वहाँ एक RecyclerView, RecyclerView आइटम के 2 प्रकार (अनुच्छेद और NativeAdExpress) है।

अद्यतन: क्यों यह हो रहा है पर मेरा अनुमान है जिसका मुख्य कारण स्थानीय विज्ञापनों को वेब दृश्य में प्रस्तुत व्यक्त है, और इस वेबव्यू तो ध्यान केंद्रित इस इसे करने के लिए स्क्रॉल करने के लिए RecyclerView का कारण बनता है प्राप्त करता है, लेकिन यह है कि केवल एक अनुमान है

अद्यतन 2: स्पष्ट रूप से यह समर्थन लिब में एक मुद्दा है। 24.0.0, वह भी up2date :(होने का शुल्क नहीं लिया जाता

यहाँ मेरा पूर्ण एक्सएमएल/लेआउट

<?xml version="1.0" encoding="utf-8"?> 
<my.package.custom.views.CustomDrawerLayout 
    android:id="@+id/drawer_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:openDrawer="end"> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     style="@style/AlertDialog.AppCompat.Light" 
     fontPath="fonts/fonts/DroidKufi-Regular.ttf" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="end" 
     android:fitsSystemWindows="true" 
     app:elevation="5px" 
     app:headerLayout="@layout/nav_header" 
     app:itemIconTint="@color/colorPrimary" 
     app:itemTextColor="@color/contentColor" 
     app:actionLayout="@layout/nav_item_layout" 
     app:menu="@menu/drawer_menu" 
     app:theme="@style/NavDrawerStyle" 
     tools:openDrawer="end" 
     /> 

</my.package.custom.views.CustomDrawerLayout> 

इस प्रकार है, जहां "app_bar_main.xml" है:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".ui.activities.ArticlesListActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="end"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="52dp" 
      android:background="?attr/colorPrimary" 
      android:gravity="end" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center_vertical" 
       android:orientation="horizontal" 
       android:paddingEnd="14dp" 
       android:paddingStart="14dp"> 

       <android.support.v7.widget.AppCompatImageButton 
        android:id="@+id/ivCustomDrawable" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentEnd="true" 
        android:layout_alignParentRight="true" 
        android:layout_centerVertical="true" 
        android:background="@color/transparent" 
        android:tint="@color/white" 
        /> 

       <TextView 
        android:id="@+id/view_title" 
        android:visibility="gone" 
        style="@style/SectionTitle" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_centerInParent="true" 
        /> 

       <android.support.v7.widget.AppCompatSpinner 
        android:id="@+id/sources_spinner" 
        android:gravity="center" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:transitionName="@string/transition_splash_logo" 
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
        tools:targetApi="lollipop"/> 
      </RelativeLayout> 

     </android.support.v7.widget.Toolbar> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      style="@style/TabsStyle" 
      android:layout_width="match_parent" 
      android:layout_height="42dp" 
      android:layout_gravity="bottom" 
      android:layout_marginTop="0dp" 
      android:transitionGroup="true" 
      app:tabContentStart="0dp" 
      app:tabGravity="fill" 
      app:tabIndicatorColor="@color/white" 
      app:tabIndicatorHeight="3dp" 
      app:tabMode="scrollable" 
      app:tabPaddingBottom="0dp" 
      app:tabPaddingTop="0dp" 
      app:tabTextAppearance="@style/TextAppearance.RegularTextFont" 
      /> 

    </android.support.design.widget.AppBarLayout> 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      tools:context=".ui.activities.ArticlesListActivity" 
      tools:showIn="@layout/activity_newsitem_list"> 

     <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
    </RelativeLayout> 
</android.support.design.widget.CoordinatorLayout> 

और अंत में मेरे पास 2 व्यू प्रकार हैं आइटम और नेटिवएडएक्सप्रेस: ​​

मूल एडीएक्सप्रेस व्यूहोल्डर निम्नानुसार है:

public class NativeExpressAdViewHolder extends BaseCardAdViewHolder { 
    private final NativeExpressAdView view; 
    private boolean loaded = false; 
    private AdListener adListener; 
    private WeakReference<Context> context; 

    public NativeExpressAdViewHolder(View itemView, String adId, Context context) { 
     super(itemView); 
     view = new NativeExpressAdView(context); 
     view.setAdUnitId(adId); 
     ((LinearLayout) itemView.findViewById(R.id.express_ad_holder)).addView(view); 
     this.context = new WeakReference<>(context); 
    } 

    public void loadAd(float cardWidthInDips) { 
     if (!loaded && null != context.get() && !view.isLoading()) { 
      int width = cardWidthInDips > 0 ? (int) cardWidthInDips : 330; 
      if (view.getAdSize() == null) { 
       view.setAdSize(new AdSize(width, 330)); 
       view.setAdListener(new AdListener() { 
        @Override 
        public void onAdLoaded() { 
         super.onAdLoaded(); 
         loaded = true; 
         if (adListener != null) { 
          adListener.onAdLoaded(); 
         } 
        } 

        @Override 
        public void onAdFailedToLoad(int i) { 
         super.onAdFailedToLoad(i); 
         if (adListener != null) { 
          adListener.onAdFailedToLoad(i); 
         } 
        } 

        @Override 
        public void onAdOpened() { 
         super.onAdOpened(); 
         if (adListener != null) { 
          adListener.onAdOpened(); 
         } 
        } 
       }); 
      } 
      new Handler(context.get().getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        view.loadAd(new AdRequest.Builder().build()); 
       } 
      }); 
     } 
    } 

    public NativeExpressAdView getView() { 
     return view; 
    } 

    public void setAdListener(AdListener adListener) { 
     this.adListener = adListener; 
    } 

    @Override 
    public void destroyAd() { 
     if (view != null) { 
      view.destroy(); 
      loaded = false; 
     } 
    } 
} 

और विज्ञापनों के रूप में निम्नानुसार एक कस्टम एडाप्टर का उपयोग कर बनाने हैं:

private BaseCardViewHolder createNativeExpressAdViewHolder(ViewGroup parent) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ad_express, parent, false); 
     final NativeExpressAdViewHolder viewHolder = new NativeExpressAdViewHolder(
      view, 
      adManager.getNativeExpressAdId(), 
      context.get() 
     ); 
     adViewHolders.add(viewHolder); 
     viewHolder.setAdListener(new AdListener() { 
      @Override 
      public void onAdFailedToLoad(int errorCode) { 
       Log.i("ADS", "onAdFailedToLoad " + errorCode); 
      } 

      @Override 
      public void onAdLoaded() { 
       super.onAdLoaded(); 
       // Do something 
      } 
     }); 
     viewHolder.loadAd(cardWidthInDips); 

     return viewHolder; 
    } 

उत्तर

12

मैं समझ में नहीं आया है, जहां आप वास्तव में अपने कोड में एक RecyclerView लागू लेकिन यहाँ वैसे भी हो सकता है कुछ है कि आपके मामले में काम कर सकता है।

मुझे GridView के साथ एक ही समस्या थी जो हमेशा Fragment के पहले लोड के दौरान ध्यान केंद्रित कर रही थी, यह स्वचालित रूप से सीधे GridView पर स्क्रॉल कर रहा था।

परीक्षण का एक बहुत बाद, मैं अंत में GridView की मूल लेआउट पर इस एक लाइन के साथ इस व्यवहार बंद कर दिया:

android:descendantFocusability="blocksDescendants" 

इस लाइन मूल रूप से इसका मतलब है कि माता-पिता लेआउट से सभी सन्तान अब और ध्यान केंद्रित नहीं किया जाएगा । आप इसे अपने RecyclerView पैरेंट लेआउट पर आज़मा सकते हैं।

+1

धन्यवाद यह बहुत काम है, हालांकि मुझे यह कहना है कि सामान्य रूप से यह समस्या एंड्रॉइड समर्थन lib के केवल "कुछ" संस्करण को प्रभावित करती है। जैसे 23.4.0 प्रभावित नहीं है जबकि 23.2.x और 23.3.0 और 24.0.0 इस मुद्दे से प्रभावित हैं !! – Shehabix

0

मैं RecyclerView स्क्रॉल, NativeAdExpress के लिए विशेष रूप नहीं के साथ एक समान समस्या थी ... लेकिन वहाँ Android समर्थन पुस्तकालय24.0.0 इस से संबंधित के साथ एक समस्या हो रहा है। एंड्रॉइड: descendantFocusability = "blockDescendants" मेरे लिए काम नहीं किया। लेकिन डाउनग्रेडिंग एंड्रॉइड सपोर्ट लाइब्रेरी23.4.0 ने इसे फिर से काम करना शुरू कर दिया।

1

मुझे नहीं पता कि यह समस्या है, लेकिन ऐसा लगता है कि RecyclerView ने समर्थन पुस्तकालय 23.4.0 से 24.2.0 तक कहीं भी अपना व्यवहार बदल दिया है।

अब वंश के लिए डिफ़ॉल्ट करने की बजाय फोकसबिलिटी = पहले डिस्केन्डेंट्स, यह डिस्केन्डेंट्स के बाद डिफ़ॉल्ट है, जिसके कारण यह अपने बच्चों को अपने लिए लेने के बजाए फोकस प्रदान करता है।

जब कोई बच्चा फोकस करता है, तो यह इसे दृश्यमान बनाने के लिए स्क्रॉलिंग समाप्त होता है।

मैंने पिछले व्यवहार को पुनर्प्राप्त करने के लिए एंड्रॉइड: अवरोही फोकसबिलिटी = "पहले डिस्केन्डेंट्स" को रीसाइक्लिंग व्यू में जोड़कर तय किया, जहां यह ध्यान केंद्रित करता है, जहां यह स्वयं ध्यान केंद्रित करता है।

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