如何在自定义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
相关产品推荐
相关产品推荐

