17

Sto cercando di compilare alcuni dati in un RecyclerView con GridLayoutManager:Come posso riempire RecyclerView con GridLayoutManager da destra a sinistra

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false); 

Questo riempirò i dati nella griglia da sinistra a destra. Il primo elemento verrà inserito nel posto in alto a sinistra, ecc.

Tuttavia, l'app che sto sviluppando è progettata per un linguaggio RTL, quindi devo riempirlo da da destra a sinistra.

Ho provato a modificare l'ultimo argomento in true. Ma ha solo fatto scorrere lo RecyclerView fino in fondo.

anche l'impostazione layoutDirection attributo per RecyclerView non funziona (senza considerare che la mia min API è 16 e questo attributo viene aggiunto per API17 +):

<android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layoutDirection="rtl" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

Come si crea una destra a sinistra griglia riempita con RecyclerView?

+0

provare Gentilmente utilizzando Android: rotationY =" 180 "primo –

+0

è possibile ottenere questo dall'animazione .. –

+0

si prega di consultare questa risposta: [link] (https://stackoverflow.com/questions/31728837/recyclerview-grow-element-from-right-to-left/46315909 # 46315909) –

risposta

43

Creare una classe che estende GridLayoutMAnager, e l'override del metodo isLayoutRTL() in questo modo:

public class RtlGridLayoutManager extends GridLayoutManager { 

    public RtlGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    public RtlGridLayoutManager(Context context, int spanCount) { 
     super(context, spanCount); 
    } 

    public RtlGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { 
     super(context, spanCount, orientation, reverseLayout); 
    } 

    @Override 
    protected boolean isLayoutRTL(){ 
     return true; 
    } 
} 
+3

Grazie Mohammad! Risolto il problema magnificamente. –

+0

Grazie! In realtà, ['isLayoutRTL()'] (https://developer.android.com/intl/zh-tw/reference/android/support/v7/widget/LinearLayoutManager.html#isLayoutRTL()) è un metodo protetto documentato di ** GridLayoutManager **, quindi questa soluzione è compatibile con le versioni successive. –

+0

Grazie Mohammad, è stato grandioso. –

1

Sul lato di esso, GridLayouManager deve fill rows from right quando getLayoutDirection()ViewCompat.LAYOUT_DIRECTION_RTL. Normalmente, questa direzione verrà ereditata dal contenitore RecyclerView's.

Ma se questo non funziona come previsto, o è necessario portarlo verso il basso all'API 16, o qualche dispositivo con una cattiva implementazione del supporto RTL, basta semplicemente estrarre lo GridLayoutManager da github e utilizzare un gestore personalizzato che ti sintonizzi a tuo piacimento.

Potrebbe essere sufficiente estendere lo stock GridLayoutManager e sovrascrivere layoutChunk().

+0

Non riesco a sovrascriverlo poiché è visibile in un pacchetto. Inoltre non sono riuscito a trovare dove viene utilizzato questo metodo. Ma sembra promettente. –

+1

Cosa può impedirti di avviare il tuo gestore personalizzato con l'istruzione 'pacchetto android.support.v7.widget;'? –

+1

Grazie Alex. Non lo sapevo. In realtà è stato molto semplice aggirare il problema. Grazie per gli indizi –

-4

E 'molto semplice, basta chiamare il metodo setReverseLayout come,

GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false); 
layoutManager.setReverseLayout(true); 
+3

Questo lo renderà solo sottosopra! – Ammar

Problemi correlati