【问题标题】:setOnLongClickListener in android with kotlinandroid 中的 setOnLongClickListener 与 kotlin
【发布时间】:2018-01-30 11:35:56
【问题描述】:

如何在我的ListView 的每个项目中使用setOnItemClickListner

我的 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 时,它不起作用,我可以在哪里使用?

【问题讨论】:

标签: android listview kotlin


【解决方案1】:

在你的活动课上试试这个

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

【讨论】:

  • 我在哪里可以使用这个方法?
  • 如果您需要在适配器中,请在适配器类中使用它
  • 检查我更新的答案并放入您的适配器类
  • 这个 Kotlin 怎么样?!
  • 使用我发布的 kotlin 检查
【解决方案2】:

虽然有点古怪,但这对我来说很好。

    latestMessagesAdapter.setOnItemLongClickListener { item, view ->
        val row = item as LatestMessageRow
        return@setOnItemLongClickListener(true)
    }

【讨论】:

    【解决方案3】:

    首先我想说的是RecyclerView而不是ListView。您可以找到大量信息为什么要这样做。例如,您可以阅读它听到:

    RecyclerView vs. ListView

    关于您的问题,如何使用RecyclerView 以正确的方式进行操作。

    使用 RecyclerView 插入依赖项,它们现在位于 Kotlin 的支持库中。

    实现“com.android.support:appcompat-v7:25.4.0”

    首先在 xml 布局中使用 RecyclerView 更改您的 ListView,如下所示:

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

    RecyclerView 创建Adapter

    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)
    

    Fragment/Activity中将您的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
    }
    

    就是这样。现在一切都应该正常了。希望对您有所帮助。

    【讨论】:

    • 此答案不直接回答问题,请根据问题描述进行修改。谢谢
    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2015-10-15
    相关资源
    最近更新 更多