2017-08-22 10 views
3

ListViewの各項目にsetOnItemClickListnerをどのように使用できますか?andOnLongClickListener with kotlin

私のxml:

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

</ListView> 

この私のアダプタクラス

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] 

    } 


} 
  • 私は私のListView

に各項目のリスナーをしたいと私はこの方法setOnClickListenerを使用する場合アダプタは動作しません。どこで使用できますか?

+0

https://stackoverflow.com/questions/45783452/setonlongclicklistener-in-kotlin-android [kotlinアンドロイドでsetOnLongClickListener]の –

+0

可能な重複(https://stackoverflow.com/questions/45783452/setonlongclicklistener-in-kotlin -android) – BakaWaii

+0

ListView setOnItemClickListnerを使用するsetOnClickListener –

答えて

2

は、私はそれがRecyclerViewいうよりListViewであることをお伝えしたいと思いますまず第一に

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


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

このメソッドはどこで使用できますか? –

+0

アダプタが必要な場合は、アダプタクラス –

+0

を使用してください。私の更新された回答を確認し、アダプタクラスを入力してください。 –

0

アクティビティクラスでこれを試してみてください。あなたはそのようなことをする理由を十分に知ることができます。たとえば、あなたはそれが聞く読むことができます:

RecyclerView vs. ListView

RecyclerViewに正しい方法でそれを行うにはどのようにあなたの質問について。

RecyclerViewに依存関係を挿入すると、Kotlinのサポートライブラリに追加されました。

実装 "com.android.support:appcompat-v7:25.4.0"

は、まず、このようなXMLレイアウトでRecyclerViewを使用してリストビューを変更します。

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

作成AdapterRecyclerView用:

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> 

モデル(Kotlinにあなたが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) 

RecyclerViewにごAdapterを接続します

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 
} 

これがすべてです。すべてが今働くはずです。それが役に立てば幸い。