如何在我的回收站视图中为自定义ViewHolder实现OnClickListener? [英] how to implement OnClickListener for custom ViewHolder in my recycler view?

查看:67
本文介绍了如何在我的回收站视图中为自定义ViewHolder实现OnClickListener?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应在recyclerview中显示蓝牙设备的应用程序,我希望用户能够单击这些项目来执行操作.现在,我只是想使烤面包片显示在单击上,但稍后,我可能希望显示一个对话框,以提供配对的选择,等等.但是,我在onclicklistener的使用中明显缺少某些内容.我试图让我的ViewHolder类: DeviceHolder 实现View.OnClickListener,并将对Toast.makeText()的调用放在我的onClick覆盖内.但是,什么都没有发生.我确定我只是缺少一些小东西,希望能帮助您发现问题.我也是在Kotlin中这样做的,这是我的新手,如果有一种更有效的Kotlin类型的方式来做到这一点,那也将有所帮助.我在下面发布我的代码.预先感谢.

i am creating an app that is supposed to display bluetooth devices in a recyclerview and i want a user to be able to click the items to perform an action. for now i am just attempting to make a toast appear on click but later i would like to possibly display a dialog giving choices to pair, etc. however i am apperently missing something in my usage of onclicklistener. i am attempting to have my ViewHolder class: DeviceHolder implement View.OnClickListener and placing the call to Toast.makeText() inside of my onClick override. however, nothing is happening. i am sure i am just missing something minor and would appreciate help finding the problem. also i am doing this in kotlin which i am new to and if there is possibly a more efficient, kotlin type of way to do this that would also be of help. i am posting my code below. thanks in advance.

class DeviceAdapter(val mContext : Context) : RecyclerView.Adapter<DeviceAdapter.DeviceHolder>(){

val mDevices = ArrayList<BluetoothDevice>()

interface OnClickListener{
    fun onClick(v: View)
}

fun updateItems(list: ArrayList<BluetoothDevice>){
    mDevices.clear()
    mDevices.addAll(list)
    Log.d(TAG, "updating items : $mDevices")
    notifyDataSetChanged()
}

fun ViewGroup.inflate(@LayoutRes res: Int, attachToRoot: Boolean = false): View{
    return LayoutInflater.from(mContext).inflate(res, this, attachToRoot)
}

override fun onBindViewHolder(holder: DeviceHolder, position: Int) {
    Log.d(TAG, "onBindViewHolder called!")
    holder.bindItems(mDevices.get(position))
}

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): DeviceAdapter.DeviceHolder{
    Log.d(TAG, "onCreateViewHolder called!")
    val v = parent!!.inflate(R.layout.device_item, false)
    return DeviceHolder(v)
}

override fun getItemCount(): Int {
    return mDevices.size
}

inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {

    override fun onClick(v: View?) {
        Toast.makeText(mContext, "test", Toast.LENGTH_LONG).show()
    }

    val nameView = itemView.findViewById(R.id.nameView) as TextView
    val addrView = itemView.findViewById(R.id.addressView) as TextView

    fun bindItems(btDevice: BluetoothDevice) {
        Log.d(TAG, "holder created!")
        nameView.text = btDevice.name
        addrView.text = btDevice.address
        itemView.setOnClickListener { this }
    }

}

companion object {
    val TAG = "Device Adapter"
}
}

以下是日志消息:

10-09 00:35:50.233 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device found!
10-09 00:35:51.795 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device found!
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: device list : [**:B8:9A:39:1D:**, **:DF:BF:2A:F3:**]
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: updating items : [**:B8:9A:39:1D:**, **:DF:BF:2A:F3:**]
10-09 00:35:56.752 7581-7581/com.example.zemcd.toofxchange D/DiscoveryTask: discovery finished
10-09 00:35:56.762 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onCreateViewHolder called!
10-09 00:35:56.774 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onBindViewHolder called!
10-09 00:35:56.774 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: holder created!
10-09 00:35:56.783 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onCreateViewHolder called!
10-09 00:35:56.786 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: onBindViewHolder called!
10-09 00:35:56.786 7581-7581/com.example.zemcd.toofxchange D/Device Adapter: holder created!

推荐答案

我设法通过消除OnClickListener的实现并仅使用此语句代替了itemView.setOnClickListener { /* lamda here */ }来解决此问题.我不相信这种确切的语法在Java中可用,但在Kotlin中有效.这是我的修改后的代码:

i managed to get this fixed by eliminating the implementation of OnClickListener and just using this statement instead itemView.setOnClickListener { /* lamda here */ }. i don't believe this exact syntax is available in java but in kotlin in works. here is my revised code :

inner class DeviceHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    val nameView = itemView.findViewById(R.id.nameView) as TextView
    val addrView = itemView.findViewById(R.id.addressView) as TextView

    fun bindItems(btDevice: BluetoothDevice) {
        Log.d(TAG, "holder created!")
        nameView.text = btDevice.name
        addrView.text = btDevice.address
        itemView.setOnClickListener { Toast.makeText(it.context, "testing", Toast.LENGTH_SHORT).show() }
    }

}

通过使用lambda内的it关键字

,我访问了itemView对象的上下文,而不是使用上述的原始mContext.我仍然不确定为什么我的旧方法不起作用,但这确实对我有用.

by using the it keyword inside of the lambda i accessed the context of the itemView object, instead of using my original mContext described above. i am still unsure of exactly why my old approach did not work, but this did so that works for me.

这篇关于如何在我的回收站视图中为自定义ViewHolder实现OnClickListener?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆