0
votes

Comment puis-je modifier le nombre de colonnes dans Android automatiquement basé sur le contenu de RecyclerView?

Je travaille dans Android Studio sur un projet, qui a un jeu de quiz avec des images ou un texte comme des options de réponse, en fonction de la question (les deux ne sont que des boutons du fichier XML). Actuellement, ces boutons sont affichés dans 2 colonnes, mais dans le cas où les boutons affichent du texte au lieu d'images, le nombre de colonnes doit être 1 car la taille du bouton doit être plus large pour afficher le texte entier.

dans mon adaptateur Le tinbindviewholder em> Obtient une liste des options de réponse et définit le contenu du bouton en fonction du type d'option (images / texte). Pour certains tests, j'ai créé la sous-classe AutofitrecyClerView em> de recylview pour calculer le nombre de colonnes automatiquement mais cela n'a pas résolu mon problème. À l'intérieur de AutofitrecyClerView em> J'ai défini un centréedgridlayoutManager em>. En outre, j'ai expérimenté la méthode SetSpansizElookUp em> mais cela n'a pas non plus aidé. P>

AutofitrecyClerview: strong> P>

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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"
    tools:context="de.lmu.treeapp.activities.minigames.chooseAnswer.GameActivity_ChooseAnswer">

    <TextView
        android:id="@+id/game_description"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="25dp"
        android:layout_marginEnd="20dp"
        android:layout_marginBottom="20dp"
        android:text="@string/game_description_placeholder"
        app:layout_constraintTop_toTopOf="@+id/guideline_top"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintVertical_bias="0.04" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.02" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.98" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.02" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_mid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.3" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_bot"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.98" />

    <de.lmu.treeapp.activities.minigames.chooseAnswer.AutofitRecyclerView
        android:id="@+id/auto_fit_recycler_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="20dp"
        android:clipToPadding="false"
        android:columnWidth="150dp"
        android:numColumns="auto_fit"
        app:layout_constraintBottom_toBottomOf="@id/guideline_bot"
        app:layout_constraintEnd_toEndOf="@id/guideline_right"
        app:layout_constraintStart_toStartOf="@id/guideline_left"
        app:layout_constraintTop_toBottomOf="@+id/guideline_mid" />

</androidx.constraintlayout.widget.ConstraintLayout>


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser un framelayout et mettre les deux boutons dedans et faire disparaître les deux boutons. Un Framelayout n'ayerait qu'une seule vue unique, donc si la réponse est un texte, vous ne pouvez rendre que le bouton de texte visible sinon, vous rendez l'image -Button visible.


2 commentaires

Ok, j'ai maintenant changé la mise en page à Framelayout, mais il reste toujours le problème que les deux images et le texte sont présentés dans deux colonnes au lieu de différencier les autres. Dans le Onbindviewholder de mon adaptateur, je fais une distinction de cas et définir le bouton correspondant visible. Existe-t-il une option pour clarifier le nombre de colonnes à ce point ou ailleurs? - Merci pour ton aide.


J'ai mis le code de la mise en page ci-dessous. Les colums sont maintenant calculés dans la catégorie autofitrecyclerview où un GridlayoutManager est utilisé pour configurer le recyclerview .



0
votes

a finalement trouvé un moyen de déterminer le numéro de colonne. Dans ma classe d'adaptateur, j'ai écrit une méthode qui obtient une liste des options de réponse actuelles et renvoie true si le type est Image em>. Dans la classe autofitrecyclerview em>, j'ai remplacé la méthode OnMeasure em> avec le code suivant afin de définir le Spanount em> vers 1 ou 2:

@Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        super.onMeasure(widthSpec, heightSpec);
        if (columnWidth > 0) {
            int spanCount;
            if(RecyclerViewAdapter.isImage(RecyclerViewAdapter.options)){
                spanCount = 2;
            } else spanCount = 1;

            manager.setSpanCount(spanCount);
        }
    }


0 commentaires

0
votes

mise en page xml de boutons: xxx

La visibilité des deux boutons est définie sur parti et sera modifiée dans le code à Runtime.


0 commentaires