2015-05-05 7 views
10

Come posso ottenere due RecyclerViews l'uno sotto l'altro in un unico layout? Non voglio avere una sola RecyclerView per tutti gli articoli. Il mio codice:Due RecyclerViews sotto l'un l'altro in un unico layout

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:background="@color/main__item_background" 
android:layout_height="match_parent" 
android:layout_width="match_parent"> 

<TextView 
    android:text="@string/find_friends__already_playing" 
    android:background="@color/header" 
    android:gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/list_header" 
    android:visibility="visible"/> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/in_app_friends" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content"/> 

<TextView 
    android:text="@string/find_friends__invite_friends" 
    android:background="@color/find_friends__header" 
    android:gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/list_header" /> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/friends_to_invite" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" /> 
</LinearLayout> 

risposta

17

mi sono trovato la risposta.

è necessario mettere il LinearLayout in un ScrollView e utilizzare wrap_content come RecyclerView di layout_height.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:fillViewport="true"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/list_header" 
     android:background="@color/header" 
     android:gravity="center" 
     android:text="@string/find_friends__already_playing" 
     android:visibility="visible" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/in_app_friends" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="5dp" 
     android:background="@color/white"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/list_header" 
     android:background="@color/find_friends__header" 
     android:gravity="center" 
     android:text="@string/find_friends__invite_friends" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/friends_to_invite" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/white"/> 
</LinearLayout> 
</ScrollView> 

Inoltre v'è un bug con con RecyclerView e wrap_content quindi si deve utilizzare un gestore di layout personalizzati . Date un'occhiata a questo post: How do I make WRAP_CONTENT work on a RecyclerView

+4

Dovresti semplicemente usare un 'RecyclerView' con diversi tipi di visualizzazione degli articoli. 'RecyclerView.Adapter' ha un 'getItemViewType (int position)' che verrà passato in 'onCreateViewHolder (ViewGroup parent, int itemtype)' dove è possibile attivare il tipo e creare il corretto 'RecyclerView.ViewHolder'. –

+5

Cosa devo fare, quando devo usare modelli diversi nei centri di riciclaggio? –

+0

'wrap_content' è ora ** fisso ** nell'ultima libreria di supporto Android ** non è necessario ** scrivere un gestore di layout personalizzato –

2

È possibile dare ad ogni RecycleView altezza pari a 0DP e peso pari a 1:

android:layout_height="0dp" 
android:layout_width="match_parent" 
android:layout_weight="1" 
+0

Non voglio che entrambi tocchino la metà dello schermo. Voglio che siano fatti scorrere uno dopo l'altro. –

7

Ho anche avuto lo stesso problema e ho scritto una libreria che aiuta a raggiungere questo unendo adattatori e layout.

Gradle dipendenza per provarlo (esigenze jcenter repo):

compile 'su.j2e:rv-joiner:1.0.3'//latest version by now 

Thea cambiamento xml di utilizzare un unico RecyclerView che corrisponde genitore:

<android.support.v7.widget.RecyclerView 
    android:id="@+id/joined_friends_rv" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="5dp" 
    android:background="@color/white"/> 

Poi init RecyclerView in codice come questo:

//init your RecyclerView as usual 
    RecyclerView rv = (RecyclerView) findViewById(R.id.joined_friends_rv); 
    rv.setLayoutManager(new LinearLayoutManager(this)); 

    //construct a joiner 
    RvJoiner rvJoiner = new RvJoiner(); 
    rvJoiner.add(new JoinableLayout(R.layout.your_title_for_in_app)); 
    rvJoiner.add(new JoinableAdapter(new YourInAppRvAdapter())); 
    rvJoiner.add(new JoinableLayout(R.layout.your_title_for_invite)); 
    rvJoiner.add(new JoinableAdapter(new YourInviteRvAdapter())); 

    //set join adapter to your RecyclerView 
    rv.setAdapter(rvJoiner.getAdapter()); 

È possibile controllare this link per ulteriori dettagli della libreria e spiegazione. Spero che sia d'aiuto.

+0

L'aggiunta di questa libreria tramite build.gradle crea un errore durante la sincronizzazione –

0

Basta usare:

<android.support.v7.widget.RecyclerView 
    android:id="@+id/card_recycler_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="10dp" 
    android:scrollbars="vertical" 
    android:layout_below="@+id/your_first_recycler"/> 

ultima riga è per il vostro problem.use esso.

1

Usa NestedScrollView come layout di genitore, dovrebbe avere

android:weightSum="2" 

e dare

android:layout_weight="1" 

ad ogni RecyclerView di yours.It da scorrere uno dopo l'altro.

1

se si visualizza la parte inferiore di recyclerview che non scorre con il contenuto principale, modificare LinearLayout (vedere la risposta da alan_derua) a ConstraintLayout e avvolgere le due RecyclerViews all'interno. Vedi il codice sottostante:

<ScrollView 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="fill_parent" 
android:layout_height="wrap_content" 
android:fillViewport="true"> 

<android.support.constraint.ConstraintLayout 
    android:id="@+id/task_list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/first_list_view" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     app:layout_constraintBottom_toTopOf="@+id/textView3" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintVertical_chainStyle="packed" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="24dp" 
     android:layout_marginStart="24dp" 
     android:layout_marginTop="24dp" 
     android:gravity="left" 
     android:paddingTop="0dp" 
     android:text="@string/my_tasks" 
     app:layout_constraintBottom_toTopOf="@+id/second_list_view" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/first_list_view" /> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/second_list_view" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toBottomOf="@+id/textView3" /> 

</android.support.constraint.ConstraintLayout> 
</ScrollView> 

Questo ha funzionato per me!

Problemi correlati