2017-09-30 1 views
-1

-je utiliser un adaptateur personnalisé pour Liste sur mon application Android. Je ne sais pas comment définir l'écouteur pour le clic de l'élément. J'utilise Kotlin pour mon application.Comment setOnItemClickListener pour la liste avec adaptateur personnalisé par Kotlin

Ceci est ma mise en page de l'adaptateur.

<?xml version="1.0" encoding="utf-8"?> 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    android:orientation="vertical" android:layout_width="match_parent" 
 
    android:layout_height="match_parent"> 
 
    <RelativeLayout 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent"> 
 
    <CheckBox 
 
     android:id="@+id/cbx" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:text="" /> 
 
    <TextView 
 
     android:id="@+id/txtNameNote" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:text="TextView" 
 
     android:layout_toRightOf="@+id/cbx" 
 
     /> 
 
    <TextView 
 
     android:id="@+id/txtPercent" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="match_parent" 
 
     android:text="TextView" 
 
     android:layout_toRightOf="@+id/cbx" 
 
     android:layout_below="@+id/txtNameNote" 
 
     /> 
 
    </RelativeLayout> 
 
</LinearLayout>
Ceci est mon code adaptateur

class CustomAdapter(internal var context: Context, resource: Int, internal var listNote: ArrayList<Note>) : ArrayAdapter<Note>(context, resource, listNote) { 
 
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 
 
     var convertView = convertView 
 
     // TODO Auto-generated method stub 
 
     val inflater = (context as Activity).layoutInflater 
 
     convertView = inflater.inflate(R.layout.rowlistitem, parent, false) 
 
     val name = convertView!!.findViewById<View>(R.id.txtNameNote) as TextView 
 
     val percent = convertView.findViewById<View>(R.id.txtPercent) as TextView 
 
     val cb = convertView.findViewById<View>(R.id.cbx) as CheckBox 
 
     name.text = listNote[position].name 
 
     percent.text = "Percent: " + listNote[position].percent + "%" 
 

 
     if (listNote[position].status == NoteStatus.Active.value) 
 
      cb.isChecked = false 
 
     else{ 
 
      name.paintFlags = (name.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG) 
 
      cb.isChecked = true 
 
     } 
 
     } 
 
     } 
 
     return convertView 
 
    } 
 
}

Quelqu'un peut me aider?

+0

Peut-on voir le code de la carte? – pRaNaY

+0

J'ai mis à jour mon code d'adaptateur, s'il vous plaît consulter. Merci ! –

Répondre

1

La bonne façon de Kotlin est en créant un rappel. Ensuite, vous créez un écouteur de clic dans votre adaptateur et transmettez le résultat à votre rappel.

class CustomAdapter(
     internal var context: Context, 
     resource: Int, 
     internal var listNote: ArrayList<Note>, 
     val callback: (Note) -> Unit) : ArrayAdapter<Note>(context, resource, listNote) { 
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 
     // .. do your bindings whatever 
     convertView.yourRootLayoutElement.setOnClickListener{ 
      if (callback != null) callback(listNote[position]) 
     } 
     return convertView 
    } 
} 

Dans votre vue où vous créez votre carte

CustomAdapter(...., { info { "Clicked $it" } }) 

Je ne l'ai pas testé depuis que je ne l'utilise ListView. Je vous recommande d'utiliser RecyclerView. ListView est déconseillé et non recommandé pour plusieurs raisons. Lisez quelques-unes des raisons here.

Edit: Il n'y a absolument aucune raison pour l'utilisation d'un ListView sur une RecyclerView. Même si cela fonctionne, vous ne devriez pas l'utiliser. Apprenez le RecyclerView depuis ListView devrait plus utilisé.