2016-06-19 27 views
6

Ho uno strano "problema" o potrebbe essere una "funzione" e non so, ogni volta che NativeAdExpress è caricato nel mio RecyclerView se solo parte del NativeAd è visibile, obbliga il RecyclerView a scorrere fino a quando l'annuncio nativo diventa completamente visibile, questo comportamento fa sì che l'elenco continui a saltare mentre faccio scorrere.NativeAdsExpress forza RecyclerView a scorrere per rendere completamente visibile NativeAd al primo caricamento

mio layout è principalmente:

Attività> AppBar con schede e ViewPager> ogni pagina del Pager contiene PullToRefresh e al suo interno c'è un RecyclerView, Il RecyclerView dispone di 2 tipi di oggetti (articolo e NativeAdExpress).

UPDATE: La mia ipotesi sul perché questo sta accadendo è soprattutto perché gli annunci nativi esprimono il rendering in una WebView, e questo WebView viene attivato allora questo fa sì che il RecyclerView per scorrere fino ad essa, ma questa è solo un'ipotesi

UPDATE 2: Apparentemente questo è un problema in Support Lib. 24.0.0, che è il costo di essere troppo up2date :(

di Heres mia completa XML/Layout

<?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> 

dove "app_bar_main.xml" è la seguente:

<?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> 

e, infine, Ho 2 View Types Item e NativeAdExpress:

NativeAdExpress ViewHolder è la seguente:

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; 
     } 
    } 
} 

e gli annunci vengono create utilizzando un adattatore personalizzato come segue:

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; 
    } 

risposta

12

non capivo dove si attuino effettivamente una RecyclerView nel codice, ma qui è in ogni caso forse qualcosa che potrebbe funzionare nel tuo caso.

Ho avuto un problema simile con un GridView sempre attivo durante il primo caricamento Fragment, inoltre si stava scorrendo automaticamente verso il basso allo GridView.

Dopo un sacco di test, ho finalmente smesso di questo comportamento con questo una riga sul layout padre del GridView:

android:descendantFocusability="blocksDescendants" 

Questa linea sostanzialmente significa che tutti i discendenti dal layout genitore non avranno concentrerà più . Puoi provarlo sul tuo layout genitore RecyclerView.

+1

Grazie mille questo ha fatto il lavoro, anche se devo dire che questo problema in generale riguarda solo "alcune" versioni di Android supportano la lib. per esempio. 23.4.0 non ha effetto mentre 23.2.xe 23.3.0 e 24.0.0 sono interessati da questo problema !! – Shehabix

0

ho avuto un problema simile con RecyclerView scorrimento, non specificamente per NativeAdExpress ... ma sembra che ci sia un problema con la libreria Android di sostegno24.0.0 relative a questo. The android: descendantFocusability = "blocksDescendants" non ha funzionato per me. Il downgrade alla libreria di supporto Android23.4.0 è stato eseguito il downgrade alla libreria .

1

Non so se si tratta di un numero , ma sembra che RecyclerView abbia cambiato il suo comportamento da qualche parte dalla libreria di supporto da 23.4.0 a 24.2.0.

Ora invece di eseguire il default su descendantFocusability = beforeDescendants, il valore predefinito è afterDescendants, che gli consente di offrire lo stato attivo ai propri figli anziché prenderlo per sé.

Quando un bambino prende la messa a fuoco, finisce lo scorrimento per renderlo visibile.

L'ho risolto aggiungendo android: descendantFocusability = "beforeDescendants" a RecyclerView, per ripristinare il comportamento precedente, in cui mantiene lo stato attivo.