2017-08-22 7 views
3

Wie kann ich setOnItemClickListner in jedem Element in meinem ListView verwenden?setOnLongClickListener in android mit kotlin

mein xml:

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

</ListView> 

dies meine Adapterklasse

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] 

    } 


} 
  • I Hörer für jedes Element möge in meinem ListView

Und wenn verwende ich diese Methode setOnClickListener in Adapter funktioniert nicht, wo kann ich verwenden?

+0

https://stackoverflow.com/questions/45783452/setonlongclicklistener-in-kotlin-android –

+0

Mögliche Duplikat [setOnLongClickListener in Kotlin android] (https://stackoverflow.com/questions/45783452/setonlongclicklistener-in-kotlin -android) – BakaWaii

+0

ListView Verwenden Sie setOnItemClickListner instand von setOnClickListener –

Antwort

2

Versuchen Sie dies in Ihrer Aktivitätsklasse

lv.setOnItemClickListener { parent, view, position, id -> 


      Toast.makeText(this, "Position Clicked:"+" "+position,Toast.LENGTH_SHORT).show() 
     } 
+0

wo kann ich diese Methode verwenden? –

+0

Wenn Sie in Adapter benötigen, verwenden Sie es in Adapterklasse –

+0

überprüfen Sie meine aktualisierte Antwort und setzen Sie Ihre Adapterklasse –

0

Zunächst einmal möchte ich sagen mag, dass es RecyclerView ist eher als ListView. Sie können viele Informationen finden, warum in solchen tun. Zum Beispiel können Sie es hören lesen:

RecyclerView vs. ListView

In Bezug auf Ihre Frage, wie es mit RecyclerView in der richtigen Art und Weise zu tun.

Fügen Sie Abhängigkeiten mit RecyclerView ein, sie sind jetzt in der Support-Bibliothek in Kotlin.

Implementierung "com.android.support:appcompat-v7:25.4.0"

zuerst Ihre Listview mit RecyclerView wie dies in XML-Layout ändern:

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

erstellen Adapter für 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> 

Modelle (in Kotlin Sie sie in einer Datei und den Namen zum Beispiel AccountModels.kt setzen können):

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) 

In Fragment/Aktivität verbinden Ihre Adapter-RecyclerView:

override fun onStart() { 
    super.onStart() 
    setupAdapter() 
} 

fun setupAdapter(){ 

    Log.d(TAG, "updating ui..") 
    val account1 = Account(1,"Credit", 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 
} 

Das ist alles. Alles sollte jetzt funktionieren. Ich hoffe es hilft.