3
votes

Comment utiliser la mise en page animée avec Recyclerview

essayez d'utiliser MotionLayout avec RecyclerView ,

lors du défilement vers le haut, l'application plante avec une erreur:

android.content.res.Resources $ NotFoundException: impossible de trouver ID de ressource # 0xffffffff

le code de mise en page du fragment est

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <Transition
        app:constraintSetEnd="@id/collapsed"
        app:constraintSetStart="@id/expanded">

        <OnSwipe
            app:dragDirection="dragUp"
            app:touchAnchorSide="top"
            app:moveWhenScrollAtTop="@+id/rv_list" />

    </Transition>

    <ConstraintSet android:id="@+id/expanded"
            android:id="@+id/cardView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:layout_constraintEnd_toEndOf="@+id/tv_delivery_type"
            app:layout_constraintStart_toStartOf="@+id/imageView15"
            app:layout_constraintTop_toBottomOf="@+id/view4" />
    </ConstraintSet>

    <ConstraintSet android:id="@+id/collapsed">
    <Constraint
            android:id="@+id/cardView"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:layout_marginTop="8dp"
            app:layout_constraintEnd_toEndOf="@+id/tv_delivery_type"
            app:layout_constraintStart_toStartOf="@+id/imageView15"
            app:layout_constraintTop_toBottomOf="@+id/view4" />
    </ConstraintSet>

</MotionScene>

et le code de description de mise en page est:

<android.support.constraint.motion.MotionLayout
    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"
    app:layoutDescription="@xml/collapsing_config_order_details"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    ...

<android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="@+id/tv_delivery_type"
        app:layout_constraintStart_toStartOf="@+id/imageView15"
        app:layout_constraintTop_toBottomOf="@+id/view4">

     ...

</android.support.v7.widget.CardView>

<android.support.v7.widget.RecyclerView
        android:id="@+id/rv_list"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/cardView"
        app:layout_constraintStart_toStartOf="@+id/cardView"
        app:layout_constraintTop_toBottomOf="@+id/cardView" />

</android.support.constraint.motion.MotionLayout>


2 commentaires

y a-t-il une ressource avec l'id 0xffffffff dans votre fichier de ressources généré automatiquement?


non, cet identifiant n'est pas prédéfini dans R.java


4 Réponses :


0
votes

Remplacez

<ConstraintSet android:id="@+id/expanded" >
<Constraint android:id="@+id/cardView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="@+id/tv_delivery_type"
        app:layout_constraintStart_toStartOf="@+id/imageView15"
        app:layout_constraintTop_toBottomOf="@+id/view4" />
</ConstraintSet>

par

<ConstraintSet android:id="@+id/expanded"
            android:id="@+id/cardView"


0 commentaires

0
votes

Chaque ConstraintSet doit avoir une Constraint par lui-même et vous devez spécifier autant de Constraint que vous souhaitez changer de scène, comme si vous souhaitez déplacer A et B ensemble avec une seule interaction, vous devez spécifier les deux dans un ConstraintSet

De plus, je ne suis pas sûr de ce que vous essayez de réaliser, mais je pense que vous besoin d'écrire du code comme ci-dessous

<OnSwipe
        app:dragDirection="dragUp"
        app:touchAnchorId="@id/rv_list"
        app:touchAnchorSide="top" />

Cela signifie que vous ciblez rv_list pour déclencher l'action.


1 commentaires

De plus, comme vous avez déjà ajouté viewId dans le fichier layout , vous devez changer android: id = "@ + id / cardView" en android: id = "@ id / cardView"



2
votes
app:moveWhenScrollAtTop="@+id/rv_list"
Vale of app:moveWhenScrollAtTop should be boolean.

0 commentaires

1
votes

Ajoutez android: nestedScrollingEnabled = "false" à votre recyclerView

fonctionne pour moi.


1 commentaires

Fonctionne aussi pour moi, tks