You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义DeviceDiscoveredViewAdapter的getView中使用pairedDevice参数?

解决Adapter中无法访问构造函数传入的pairedDevice问题

要让getView方法能访问到构造函数传入的pairedDevice,只需要把这个参数升级为类的成员属性,具体修改步骤如下:

步骤1:将pairedDevice声明为类成员属性

在Adapter的构造函数中,给pairedDevice参数添加val修饰符,这样它就会成为类的成员变量,整个类的方法(包括getView)都能直接访问:

class DeviceDiscoveredViewAdapter(
    context: Context,
    deviceDiscoveredList: List<BluetoothDevice>,
    val pairedDevice: List<Device> // 添加val,将参数转为类成员属性
) : ArrayAdapter<BluetoothDevice>(context, R.layout.device_dicovered_list_item, deviceDiscoveredList) {
    // ... 原有代码
}

步骤2:(可选)优化配对设备的判断效率

如果需要频繁判断设备是否在配对列表中,建议提前将配对设备的MAC地址提取到一个Set中(Set的查找效率远高于List),可以在类初始化时完成:

class DeviceDiscoveredViewAdapter(
    context: Context,
    deviceDiscoveredList: List<BluetoothDevice>,
    val pairedDevice: List<Device>
) : ArrayAdapter<BluetoothDevice>(context, R.layout.device_dicovered_list_item, deviceDiscoveredList) {

    // 提前提取配对设备的MAC地址到Set,提升查找速度
    private val pairedMacAddresses = pairedDevice.map { it.address }.toSet() // 请根据Device类实际字段调整address属性名

    @SuppressLint("MissingPermission")
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var view = convertView
        val data = getItem(position)
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.device_dicovered_list_item, parent, false)
        }
        val pathImage = view!!.findViewById<ImageView>(R.id.device_discovered_image)
        val name = view.findViewById<TextView>(R.id.device_discovered_name)
        val macAddress = view.findViewById<TextView>(R.id.device_discovered_mac_address)
        val paired = view.findViewById<TextView>(R.id.device_discovered_paired)

        if (data != null) {
            name.text = "${data.name ?: "N/A"}"
            macAddress.text = "${data.address ?: "N/A"}"
            if(data.bondState == BluetoothDevice.BOND_BONDED){
                paired.text = "Associato"
            }else{
                // 现在可以直接访问pairedDevice或优化后的pairedMacAddresses
                if (data.address in pairedMacAddresses) {
                    paired.text = "Associato"
                } else {
                    paired.text = "" // 或设置未配对的提示文本
                }
            }
            // image handling
            if (data.name!=null && data.name.contains(context.getString(R.string.device_zephyr_abbreviation), ignoreCase = true)){
                pathImage.setImageResource(R.drawable.zephyr_pairing)
            }else if (data.name!=null && data.name.contains(context.getString(R.string.device_cnr_abbreviation), ignoreCase = true)){
                pathImage.setImageResource(R.drawable.sensore_cnr)
            }
        }
        return view
    }
}

关键说明

  • Kotlin中,构造函数参数如果没有val/var修饰,只是局部变量,只能在构造函数内部或初始化块中使用,无法被类的其他方法访问。
  • 使用Set存储MAC地址可以避免每次判断都遍历整个pairedDevice列表,尤其是当配对设备数量较多时,能显著提升性能。

内容的提问来源于stack exchange,提问作者bircastri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:17:24