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)
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
)