2015-12-15 14 views
5

Quindi ho un ImageView come sfondo e sopra un RecyclerView orizzontale, il fatto è che voglio che RecyclerView inizi a mostrare i suoi elementi da metà padding dello schermo a sinistra in modo da puoi vedere perfettamente lo sfondo all'inizio e quando scorri gli elementi nasconderai l'immagine/lo sfondo.Horizontal RecyclerView con padding iniziale

Nota: selezionare Play Store per vedere cosa sto cercando di ottenere.

enter image description here

Così ho avuto questo lavoro:

<RelativeLayout 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="#000052" 
android:orientation="vertical" > 

     <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="200dp" 
     android:scaleType="centerCrop" 
     android:src="@drawable/trybg5" 
     android:layout_gravity="left" /> 

       <HorizontalScrollView 
       android:id="@+id/frag_home_gallery_recent_container" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:layout_gravity="right" 
       android:scrollbars="none" 
       android:layout_weight="1" 
       android:paddingBottom="@dimen/horizontalGallery_content_padding" 
       android:paddingTop="@dimen/horizontalGallery_content_padding"> 


       <LinearLayout 
        android:id="@+id/frag_home_gallery_recientes" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" 
        android:paddingLeft="150dp" /> 
      </HorizontalScrollView> 
    </RelativeLayout> 

Il mio punto non c'era per gonfiare di programmazione il layout all'interno del HorizontalScrollView, e ha funzionato bene. Ma con il tempo, ho deciso di migrare a RecyclerView e ora non funziona come previsto.

appare sullo sfondo, la Recycler inizia a metà schermo a destra, ma quando lo scorrimento non scorrerà fino alla sinistra dello schermo, sarà solo nascondere ovunque l'imbottitura è stata impostata ..

<RelativeLayout 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="#000052" 
android:orientation="vertical" > 

    <ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="200dp" 
    android:scaleType="centerCrop" 
    android:src="@drawable/trybg5" 
    android:layout_gravity="left" /> 

      <FrameLayout 
        android:id="@+id/frag_home_gallery_recent_container" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" 
        android:layout_gravity="right" 
        android:scrollbars="none" 
        android:layout_weight="1" 
        android:paddingBottom="@dimen/horizontalGallery_content_padding" 
        android:paddingTop="@dimen/horizontalGallery_content_padding"> 

        <android.support.v7.widget.RecyclerView 
         android:background="@drawable/gallery_bg" 
         android:id="@+id/frag_home_gallery_recientes" 
         android:scrollbars="none" 
         android:paddingLeft="150dp" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         /> 

       </FrameLayout> 
      </RelativeLayout> 

Qualche idea su come posso far funzionare questo effetto in RecyclerView?

Ecco il dettaglio del riciclatore:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="true" 
    android:id="@+id/discoContainer" 
    android:background="@drawable/gallery_bg" 
    android:layout_margin="5dp" 
    android:padding="2dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/containerDisco" 
     android:orientation="vertical"> 

     <RelativeLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 
      <ImageView 
       android:id="@+id/logoDisco" 
       android:transitionName="DiscoId" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:scaleType="centerCrop" 
       android:contentDescription="LogoDisco" 
       android:windowSharedElementsUseOverlay="false" /> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="a 600m tuyos" 
       android:padding="3dp" 
       android:layout_gravity="center_horizontal" 
       android:maxLines="1" 
       android:gravity="center_horizontal" 
       android:alpha="500" 
       android:background="#46000000" 
       android:textColor="@android:color/white"/> 
     </RelativeLayout> 

     <TextView 
      android:id="@+id/logoTexto" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="Probando" 
      android:padding="3dp" 
      android:layout_gravity="center_horizontal" 
      android:maxLines="1" 
      android:gravity="center_horizontal" 
      android:layout_alignBottom="@+id/containerDisco" /> 

    </LinearLayout> 


</LinearLayout> 

risposta

9

Invece di usare imbottiture, di solito raggiungere questo tipo di effetto con una ItemDecoration.

public class PaddingItemDecoration extends RecyclerView.ItemDecoration { 
    private final int size; 

    public PaddingItemDecoration(int size) { 
     this.size = size; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     super.getItemOffsets(outRect, view, parent, state); 

     // Apply offset only to first item 
     if (parent.getChildAdapterPosition(view) == 0) { 
      outRect.left += size; 
     } 
    } 
} 

Poi, quando si imposta il RecyclerView:

int size = ... // Get the offset that you want 
RecyclerView recyclerView = ... 

recyclerView.addItemDecoration(new PaddingItemDecoration(size)); 
+1

lavoro liscia. Grazie mille! Non l'ho considerato un problema Android, ma qualcosa di più probabile a un problema css :) –

+0

Ecco una versione estesa per Kotlin con supporto RTL: https://gist.github.com/sevar83/1172423f265e1cbb7a04f3d22b12021a – WindRider

+1

hi @ GuillermoLópez , Voglio lo stesso comportamento tranne che ho un pulsante sul lato sinistro. Come possiamo riuscirci? – Sac

1

E 'molto più semplice di quello, RecyclerView già ha questa caratteristica: basta impostare android:clipToPadding="false" al RecyclerView XML, in modo che l'imbottitura non ritaglia dai tuoi articoli.

Così, per il tuo esempio:

<android.support.v7.widget.RecyclerView 
    android:background="@drawable/gallery_bg" 
    android:id="@+id/frag_home_gallery_recientes" 
    android:scrollbars="none" 
    android:paddingLeft="150dp" 
    android:clipToPadding="false 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" />