在Kotlin中使用setOnLongClickListener处理Android中的长按事件

7

如何在我的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方法时,它不起作用,我应该在哪里使用?


https://stackoverflow.com/questions/45783452/setonlongclicklistener-in-kotlin-android - Abhishek kumar
使用setOnItemClickListener而不是setOnClickListener来操作ListView。 - Naveen Tamrakar
3个回答

9

在您的活动类中尝试以下操作:

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

这个方法在哪里可以使用? - Nour Medhat
如果你需要适配器,就在适配器类中使用它。 - Sunil P
请检查我的更新答案并放入您的适配器类中。 - Sunil P
这怎么是 Kotlin 的?! - M.Sameer
使用 Kotlin 进行检查,我已经发布了。 - Sunil P
是的,它只支持Kotlin。 - Sunil P

1
尽管有些古怪,但这对我来说工作得很好。
    latestMessagesAdapter.setOnItemLongClickListener { item, view ->
        val row = item as LatestMessageRow
        return@setOnItemLongClickListener(true)
    }

0

首先,我想说的是它应该是RecyclerView而不是ListView。你可以找到很多关于为什么要这样做的信息。例如,你可以在这里阅读:

RecyclerView vs. ListView

关于你如何用RecyclerView正确地实现它的问题。

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

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

首先,在xml布局中将你的ListView更改为RecyclerView,像这样:

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

创建适配器以用于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>

模型(在 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
}

就是这样了。现在一切都应该正常工作了。希望能帮到你。


此答案并未直接回答问题,请根据问题描述进行修改。谢谢。 - blueware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接