3 votes

Kotlin AutoCompleteTextView Adapter L'élément sélectionné donne une valeur différente

Je travaille donc avec Kotlin sur ce projet. J'utilise principalement Java et j'essaie de trouver des équivalents en Kotlin pour obtenir la même fonctionnalité.

Je récupère un tableau JSONArray de ma base de données et je le stocke dans une classe de données sérialisable appelée Congregation il comporte les variables suivantes id: Int, name: String, language: String

J'ai maintenant une activité d'enregistrement dans laquelle il y a une entrée "Congrégation", j'ai décidé d'en faire une activité d'enregistrement. AutoCompleteTextView afin que je puisse suggérer des valeurs possibles correspondant à ce que les utilisateurs tapent. J'ai créé un fichier ArrayAdapter et cela fonctionne bien lorsque l'on affiche le name d'un Congregation ( image ci-dessous)

Emulator showing RegisterActivity.java

Cependant Lorsque je sélectionne une de ces valeurs, le texte complet de la valeur s'affiche dans la liste.

Par exemple, si je sélectionne "Leeds, Crossgates (anglais)" dans l'entrée, il affichera Congregation(id=1, name=Leeds, Crossgates, language=English)

Je me demande comment je peux garder le name valeur d'un Congregation dans la boîte lorsqu'elle est sélectionnée.

De même, lorsque j'essaie de supprimer la valeur actuelle de la boîte après avoir sélectionné un élément, je reçois un message d'erreur de la part de l'administrateur. IndexOutOfBoundsException Index: 1 Size: 1

Adaptateur de tableau personnalisé (CongregationListAdapter.kt) :

class CongregationListAdapter(context: Activity, resourceId: Int, textView: Int, private var congregations: List<Congregation>)
:ArrayAdapter<Congregation>(context, resourceId, textView, congregations) {

private var inflater: LayoutInflater = context.layoutInflater
private lateinit var view: View

@SuppressLint("SetTextI18n")
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

    if (convertView == null) {
        view = inflater.inflate(R.layout.congregation_list_item, parent, false)
    }
    val name: TextView = view.findViewById(R.id.congregation_text)

    val congregation: Congregation? = getItem(position)
    if (congregation != null) {
        name.text = congregation.name + " (" + congregation.language + ")"
    } else {
        name.text = ""
        return view
    }
    return view
}

override fun getCount(): Int {
    return congregations.size
}

@SuppressLint("SetTextI18n")
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
    if (convertView == null) {
        view = inflater.inflate(R.layout.congregation_list_item, parent, false)
    }
    val congregation: Congregation? = getItem(position)
    val name: TextView = view.findViewById(R.id.congregation_text)
    if (congregation != null) {
        name.text = congregation.name + " (" + congregation.language + ")"
    } else {
        name.text = "Oops. There was a problem"
    }
    return view
}

}

Vue personnalisée (congregation_list_item.xml) :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="wrap_content"
android:background="#FFFFFF"
android:orientation="horizontal">

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/congregation_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="4dp"
        android:textColor="#000000"
        android:textSize="15sp"
        android:textStyle="normal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints"
        tools:text="Leeds, Crossgates" />

</android.support.constraint.ConstraintLayout>

</LinearLayout>

Modèle de congrégation (Congregation.kt) :

@kotlinx.serialization.Serializable
data class Congregation(
    var id: Int,
    var name: String,
    var language: String
)

0voto

Chenglong Ma Points 113

Vous pouvez simplement mettre en œuvre toString dans le Congregation classe :

@kotlinx.serialization.Serializable
data class Congregation(
    var id: Int,
    var name: String,
    var language: String
) {
    override fun toString(): String {
        return "$name ($language)"
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X