2015-03-18 17 views
22

Im un novizio in Android. Non sono sicuro del motivo per cui non posso centrare il mio oggetto in RecyclerView.Elemento di centratura Android in RecyclerView

Quello che voglio è come sotto l'immagine: -

Actual

Che Android di rendering è come sotto l'immagine: -

Reality

C'è un modo per spingere gli elementi in RecyclerView a centro? Così sarà simile a questa: -

i want like this

Ho anche fornire i file di layout, come di seguito: -

recycler_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:id="@+id/calendar_itemContainer"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="April" 
     android:id="@+id/calendar_txtMonth" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:textColor="#ff58636d" 
     android:textSize="16sp" 
     android:gravity="center|center_vertical|center_horizontal" 
     android:paddingTop="8dp" 
     android:paddingLeft="12dp" 
     android:paddingRight="12dp" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="21" 
     android:id="@+id/calendar_txtDay" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/calendar_txtMonth" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:textColor="#ff58636d" 
     android:textSize="40sp" 
     android:layout_marginTop="-10dp" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:paddingBottom="5dp" 
     android:gravity="center|center_vertical|center_horizontal" /> 
</RelativeLayout> 

fragment_calendar.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/calendar_recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="horizontal" 
     android:background="#ff2c3e50" /> 
</RelativeLayout> 

e Java codici: -

CalendarAdapter mAdapter = new CalendarAdapter(mDataset); 
mLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false); 
mRecyclerView.setLayoutManager(mLayoutManager); 
mAdapter.setCalendarCallbacks(this); 
mRecyclerView.setAdapter(mAdapter); 
mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
selectItem(mCurrentSelectedPosition); 
+0

Provare con Android: layout-gravità = "Centro" per il layout relativo e Android: gravità = "centro" per le immagini di tet..pratico funziona. –

+0

@BornToWin provato già ma ancora lo stesso. – skycrew

+0

Prova con tutto il layout e la larghezza di visualizzazione del testo per riempire_parent o match_parent. –

risposta

14

stavo cercando di fare quello che credo sia la stessa cosa che stai chiedendo quando mi sono imbattuto in questo post. Ecco la soluzione che ho finito per usare.

Creare la propria sottoclasse di LinearLayoutManager e sovrascrivere getPaddingLeft() e getPaddingRight() in questo modo.

public class CustomLayoutManager extends LinearLayoutManager { 
    private int mParentWidth; 
    private int mItemWidth; 

    public CustomLayoutManager(Context context, int parentWidth, int itemWidth) { 
     super(context); 
     mParentWidth = parentWidth; 
     mItemWidth = itemWidth; 
    } 

    @Override 
    public int getPaddingLeft() { 
     return Math.round(mParentWidth/2f - mItemWidth/2f); 
    } 

    @Override 
    public int getPaddingRight() { 
     return getPaddingLeft(); 
    } 
} 

parentWidth dovrebbe essere la larghezza della RecyclerView e itemWidth dovrebbe essere la larghezza di ciascuna delle vostre opinioni del bambino, sia in pixel. Ovviamente, questo funziona solo se sai che tutte le viste dei tuoi figli avranno la stessa larghezza.

Poi, basta usare questo gestore di layout con il RecyclerView

+0

Come hai ottenuto l'articoloWidth qui? – 3xplore

+0

@ r7v itemWidth è la larghezza della vista che stai gonfiando nell'adattatore per il tuo recyclerview. – squeeish

+0

Come ottenere genitoreWidth e itemWidth? Si prega di fornire un esempio – Madhan

5

@majormajors risposta era vicino, ma inizierà centrando la prima voce della lista e non centrare gli elementi (nel suo complesso), come mostrato nelle immagini. È necessario eseguire un calcolo aggiuntivo per verificare la larghezza totale dell'elemento. Ho modificato il codice pubblicato da @majormajors.

public class CenterItemLayoutManager extends LinearLayoutManager { 
    private final int parentWidth; 
    private final int itemWidth; 
    private final int numItems; 

    public CenterItemLayoutManager(
     final Context context, 
     final int orientation, 
     final int parentWidth, 
     final int itemWidth, 
     final int numItems) { 
    super(context, orientation, false); 
    this.parentWidth = parentWidth; 
    this.itemWidth = itemWidth; 
    this.numItems = numItems; 
    } 

    @Override 
    public int getPaddingLeft() { 
    final int totalItemWidth = itemWidth * numItems; 
    if (totalItemWidth >= parentWidth) { 
     return super.getPaddingLeft(); // do nothing 
    } else { 
     return Math.round(parentWidth/2f - totalItemWidth/2f); 
    } 
    } 

    @Override 
    public int getPaddingRight() { 
    return getPaddingLeft(); 
    } 
} 

In questo caso gli articoli saranno centrati solo se non superano la larghezza della recyclerview ... altrimenti sarà solo agire come farebbe normalmente.

+0

Come ottenere genitoreWidth e itemWidth e numItems? – Madhan

7

set recyclerview a:

android:layout_width="wrap_content" 
android:layout_gravity="center_horizontal" 

fissata per me

+0

questa era la soluzione che stavo cercando – penduDev

5

Facile come torta con la nuova classe aggiunta al supporto biblioteca- android.support.v7.widget.LinearSnapHelper

Basta creare un'istanza e collegarlo a il recyclerView come sotto-

LinearSnapHelper snapHelper = new LinearSnapHelper(); 
snapHelper.attachToRecyclerView(recyclerView); 
1

Appena aggiunto android:orientation="vertical" alla radice della visualizzazione dell'elemento. Proviamolo.

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="180dp" 
        android:orientation="vertical" 
        android:padding="4dp"> 

     <ImageView 
      android:id="@+id/movie_column_photo" 
      android:layout_width="80dp" 
      android:layout_height="120dp" 
      android:layout_gravity="center_horizontal"/> 

     <TextView 
      android:id="@+id/movie_column_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center"/> 
    </LinearLayout> 
Problemi correlati