web-dev-qa-db-fra.com

RecyclerView coupe le dernier article

J'ai un fragment avec une barre d'outils et un recyclerView à l'intérieur.

Je renseigne recyclerView avec des données factices, puis essaie de les afficher. Pour une raison quelconque, le dernier élément de recyclerView est en train d’être coupé.

C'est le XML du fragment:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/background_1"
    Android:fitsSystemWindows="true">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbar_layout"
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/height_of_app_bar"
        Android:fitsSystemWindows="true"
        Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:fitsSystemWindows="true"
            app:contentScrim="@color/primary"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                Android:id="@+id/backdrop"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:fitsSystemWindows="true"
                Android:scaleType="centerCrop"
                Android:src="@drawable/placeholder_rect_header"
                app:layout_collapseMode="parallax"/>

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/simpleList"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

</Android.support.design.widget.CoordinatorLayout>

Les éléments de la liste sont vraiment simples:

<?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="200dp"
    Android:background="@color/background_1"
    Android:orientation="horizontal"
    Android:padding="@dimen/space_for_a_bit_of_air">

    <ImageView
        Android:id="@+id/album_cover"
        Android:layout_width="100dp"
        Android:layout_height="100dp"
        Android:layout_gravity="center_vertical"
        Android:scaleType="fitXY"
        Android:src="@drawable/placeholder_album_cover"/>

    <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical"
        Android:layout_marginLeft="@dimen/space_for_distinguishing_stuff"
        Android:orientation="vertical">

        <TextView
            Android:id="@+id/album_title"
            style="@style/titleText"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@string/sample_text_c"/>

        <TextView
            Android:id="@+id/album_year"
            style="@style/subtitleText"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@string/sample_text_a"/>

    </LinearLayout>

</LinearLayout>

 I am now at the end of the list, but the last element still looks cut-off

Je suis maintenant à la fin de la liste, mais le dernier élément a toujours l’air coupé.

J'utilise la dernière version du 23/09/2015 des bibliothèques de Google, 23.0.1, (c'est-à-dire com.Android.support:recyclerview-v7:23.0.1), ainsi que la configuration suivante sur le build.gradle:

compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
   minSdkVersion 14
   targetSdkVersion 23
   versionCode 1
   versionName "1.0"

   multiDexEnabled true// Enabling multidex support
 }

Toute aide serait grandement appréciée puisque je suis en train de devenir fou avec ce problème :(

SOLUTION

Ok, après avoir nettoyé le code pour l'essentiel et éliminé la complexité, j'ai trouvé le problème: il s'agissait d'une combinaison de mauvais indicateurs et d'attributs manquants ou supplémentaires. Ce qui suit fonctionne bien pour Android 4.x et 5.x:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout
    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="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/background_1"
    Android:fitsSystemWindows="true">

    <Android.support.design.widget.AppBarLayout
        Android:id="@+id/appbar_layout"
        Android:layout_width="match_parent"
        Android:layout_height="@dimen/height_of_app_bar"
        Android:fitsSystemWindows="true">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsing_toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:fitsSystemWindows="true"
            app:collapsedTitleTextAppearance="@style/Title.collapsed"
            app:contentScrim="@color/primary"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleTextAppearance="@style/Title.Expanded"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">

            <ImageView
                Android:id="@+id/backdrop"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                Android:fitsSystemWindows="true"
                Android:scaleType="centerCrop"
                Android:src="@drawable/artistic_4"
                app:layout_collapseMode="parallax"/>

            <View
                Android:layout_width="match_parent"
                Android:layout_height="@dimen/height_of_app_bar"
                Android:background="@drawable/gradient"/>

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_width="match_parent"
                Android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"/>

        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/simpleList"
        style="@style/genericRecyclerView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:listitem="@layout/item_discography_album"/>

</Android.support.design.widget.CoordinatorLayout>

En bref, Android: fitsSystemWindows = "true" ne devrait figurer que sur les coordinatorLayout, AppBarLayout et theCollapsingToolbarLayout (qui sont ceux que nous voulons ajuster en fonction de l'écran sous Android 5.x), l'application: layout_scrollFlags doit être définie faire défiler | enterAlways | enterAlwaysCollapsed "et que la barre d’outils doit avoir pour hauteur, la hauteur de la barre d’action. Enfin, il est préférable de garder le plus propre possible RecyclerView afin de pouvoir contrôler l'espacement de la disposition sur chaque élément de campagne.

23
Sotiris Falieris

Essayez de changer votre RecyclerView height en "wrap_content" et d’ajouter la AppBarLayout height au bas de la marge.

<Android.support.v7.widget.RecyclerView
        Android:id="@+id/simpleList"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginBottom="@dimen/height_of_app_bar"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

La partie coupée de l'élément de liste correspond à la hauteur de AppBarLayout.

16
Rami

Cela a fonctionné pour moi . Régler la hauteur et la largeur de recyclerView sur 0dp

 <Android.support.v7.widget.RecyclerView
    Android:id="@+id/rv_materias"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    Android:layout_marginTop="20dp"
    Android:background="@color/secondaryLightColor"
    app:layout_constraintBottom_toTopOf="@id/bottom_navigation"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/guideline6"></Android.support.v7.widget.RecyclerView>
3
Sila Siebert

J'ai eu le même problème (même manquant un élément ViewHolder entier de ma liste) en utilisant un RecyclerView à l'intérieur d'un ConstraintLayout. Comme indiqué par Sila Siebert , la mise à zéro de layout_width et de layout_height de RecyclerView a été l’essentiel. C'est un peu déroutant car l'éditeur revient en arrière pour dire "match_constraints" après un peu de temps alors que le texte XML dit 0dp. Ne laissez pas cela vous confondre, cela devrait fonctionner.

1
Pauliman

J'ai un fragment de dialogue qui contient le RecyclerView. Pour ma structure de contraintes globale initiale, aucune des solutions ci-dessus ne fonctionnait. Je l'ai donc modifiée en une structure linéaire, qui fonctionne sans problème. Cette mise en page contient une barre d’outils et la vue recyclée. 

1
Greg Holst

Utilisez RelativeLayout en tant que parent de RecycerView.Il travaille pour moi.

0
jyothish

Créer un FrameLayout y placer RecycerView avec match_parent pour la largeur et la hauteur. Vous pouvez redimensionner la disposition du cadre comme vous le souhaitez.

0
vanJoseph

ajoutez Android: layout_gravity = "top" à la vue du recycleur. si cela ne fonctionne pas, ajoutez Android: layout_gravity = "fill_verticle"

0
Amol Suryawanshi