setOnLongClickListener en android con kotlin

¿Cómo puedo usar setOnItemClickListner en cada elemento en mi ListView ?

mi xml:

 <ListView android:id="@+id/tv1" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> 

esta mi class de adaptador

 inner class mo3d1Adapter : BaseAdapter { override fun getItemId(p0: Int): Long { return p0.toLong() } override fun getCount(): Int { return listOfmo3d.size } var listOfMkabala = ArrayList<MeetingDetails>() var context: Context? = null constructor(context: Context, listOfMkabaln: ArrayList<MeetingDetails>) : super() { this.listOfMkabala = listOfMkabaln this.context = context } override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { val mo3d = listOfmo3d[p0] var inflatormo3d = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater var myViewmo3d = inflatormo3d.inflate(R.layout.fragment_item, null) lvMo3d.onItemClickListener = AdapterView.OnItemClickListener { adapterView, view, i, l -> Toast.makeText(context, " TEST STACK ", Toast.LENGTH_LONG).show() } myViewmo3d.meeting_name.text = mo3d.name1!! myViewmo3d.meeting_date.text = mo3d.date.toString()!! myViewmo3d.attendance_number.text = mo3d.n2.toString()!! return myViewmo3d } override fun getItem(p0: Int): Any { return listOfmo3d[p0] } } 
  • Quiero oyente para cada elemento en mi ListView

Y cuando utilicé este método setOnClickListener en el adaptador, no funciona, ¿dónde puedo usarlo?

Prueba esto en tu class de actividad

 lv.setOnItemClickListener { parent, view, position, id -> Toast.makeText(this, "Position Clicked:"+" "+position,Toast.LENGTH_SHORT).show() } 

En primer lugar, me gustaría decir que es RecyclerView lugar de ListView . Puede encontrar mucha información sobre por qué hacer en tal. Por ejemplo, puedes leerlo escuchar:

RecyclerView vs. ListView

En cuanto a su pregunta sobre cómo hacerlo de la manera correcta con RecyclerView .

Inserte dependencies con RecyclerView, ahora están en la biblioteca de soporte en Kotlin.

implementación "com.android.support:appcompat-v7:25.4.0"

Primero cambie su ListView con RecyclerView en un layout xml como este:

 <android.support.v7.widget.RecyclerView android:id="@+id/accountList" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Crear Adapter para RecyclerView :

 class AccountListAdapter(val accountList: AccountList, val itemListener: (Account) -> Unit) : RecyclerView.Adapter<AccountListAdapter.ViewHolder>(){ override fun getItemCount(): Int = accountList.size override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(accountList[position]) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder{ val view = LayoutInflater.from(parent.context).inflate(R.layout.item_account, parent, false) return ViewHolder(view, itemListener) } class ViewHolder(itemView: View, val itemClick: (Account) -> Unit): RecyclerView.ViewHolder(itemView){ fun bind(account : Account){ with(account){ itemView.accountName.text = title itemView.setOnClickListener{ itemClick(this)} } } } } 

item_account.xml

 <?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="wrap_content"> <TextView android:id="@+id/accountName" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Modelos (en Kotlin puede ponerlos en un file y nombre, por ejemplo, AccountModels.kt ):

 data class AccountList(val accounts: List<Account>){ val size : Int get() = accounts.size operator fun get(position: Int) = accounts[position] } data class Account(val id : Long, val title : String, val balance : Int, val defCurrency: Int) 

En Fragment / Activity conecta tu Adapter a RecyclerView :

 override fun onStart() { super.onStart() setupAdapter() } fun setupAdapter(){ Log.d(TAG, "updating ui..") val account1 = Account(1,"Cnetworkingit", 1000, 2) val account2 = Account(2, "Debit", 500, 2) val account3 = Account(3, "Cash", 7000, 2) val accounts : List<Account> = listOf(account1, account2, account3) val adapter = AccountListAdapter(AccountList(accounts)){ val title = it.title Log.d(TAG, "$title clicked") } accountList.layoutManager = LinearLayoutManager(activity) accountList.adapter = adapter } 

Eso es todo. Todo debería funcionar ahora. Espero eso ayude.