2015-03-18 5 views
22

Ich bin ein Neuling in Android. Ich bin mir nicht sicher, warum ich meinen Artikel in RecyclerView nicht zentrieren kann.Android Centering Artikel in RecyclerView

Was ich will, ist wie unten Bild: -

Actual

Was machen Android ist wie unten Bild: -

Reality

Gibt es eine Möglichkeit, Elemente in RecyclerView zu schieben Center? So wird es wie folgt aussehen: -

i want like this

biete ich auch die Layout-Dateien wie folgt: -

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> 

und die Java-Codes: -

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

Probieren Sie mit Android: Layout-Schwerkraft = "Center" für das relative Layout und Android: Schwerkraft = "Center" auf die tetviews..hoff es funktioniert. –

+0

@BornToWin bereits versucht, aber immer noch gleich. – skycrew

+0

Versuchen Sie, mit all dem Layout und Textview Breite heraus fill_parent Oder match_parent. –

Antwort

14

Ich habe versucht zu tun, was ich denke, die gleiche Sache ist Sie fragen, wenn ich auf diesen Beitrag kam. Hier ist die Lösung, die ich am Ende benutzt habe.

Erstellen Sie Ihre eigene Unterklasse von LinearLayoutManager und überschreiben Sie getPaddingLeft() und getPaddingRight() wie folgt.

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 sollte die Breite des RecyclerView und itemWidth sollte die Breite jedes Ihres Kindes Ansichten, die beide in Pixeln. Dies funktioniert natürlich nur, wenn Sie wissen, dass alle Ihre untergeordneten Ansichten die gleiche Breite haben.

Dann nutzen Sie einfach den Layout-Manager mit Ihrer RecyclerView

+0

Wie hast du die itemWidth hier bekommen? – 3xplore

+0

@ r7v itemWidth ist die Breite der Ansicht, die du in deinem recyclerview Adapter auffüllst – squeeish

+0

Wie bekomme ich parentWidth und itemWidth? Bitte geben Sie ein Beispiel. – Madhan

5

@majormajors Antwort der Nähe war, aber durch Zentrieren des ersten Eintrags in der Liste und nicht zentriert die Elemente (als Ganze), wie gezeigt in den Bildern starten. Es muss eine zusätzliche Berechnung durchgeführt werden, um die gesamte Artikelbreite zu überprüfen. Ich habe den von @majormajors geposteten Code geändert.

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 diesem Fall werden die Elemente nur zentriert werden, wenn sie die recyclerview Breite nicht überschreiten ... sonst wird es wirkt so wie es normalerweise tun würde.

+0

Wie die Stammkomponente und ItemWidth und numItems bekommen? – Madhan

7

Satz recyclerview zu:

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

es fest für mich

+0

das war die Lösung, die ich suchte – penduDev

5

Leicht mit der neuen Klasse zu dem Träger gegeben Bibliotheks- android.support.v7.widget.LinearSnapHelper

einfach eine Instanz erstellen und hängen Sie es an der RecyclerView wie folgt:

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

android:orientation="vertical" wurde zur Stammansicht hinzugefügt. Lass es uns versuchen.

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