Android蓝牙APP中ListView在手机端不显示问题求助
ListView无法显示的排查方案
一、布局层面问题
- 未约束的LinearLayout:包裹ListView的外层LinearLayout未添加ConstraintLayout约束,导致布局位置异常甚至被遮挡。需为该LinearLayout添加约束,比如与顶部LinearLayout底部对齐,同时约束上下左右边界:
<LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:orientation="vertical" app:layout_constraintTop_toBottomOf="@id/topLinearLayout" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"> - 过大的marginStart:ListView设置了
android:layout_marginStart="150dp",在多数手机屏幕下会直接将列表推至可视区域外,建议移除或调小该值。 - ListView高度设置不合理:
android:layout_height="wrap_content"在嵌套布局中易导致高度计算异常,改为match_parent配合外层LinearLayout的约束,才能确保列表占满可用空间。
二、代码逻辑问题
- ListView未初始化:检查MainActivity的
onCreate()方法中是否存在devicelist = findViewById(R.id.listView);,若未初始化,调用setAdapter()时会无任何效果。 - 空设备名称处理:若HC-05未设置设备名称,
bt.getName()会返回null,直接添加到列表会显示空条目,建议改为同时显示名称和地址:list.add(bt.getName() != null ? bt.getName() + "\n" + bt.getAddress() : bt.getAddress()); - 权限请求后未刷新列表:用户同意蓝牙权限后,需在权限回调中重新调用
pairedDevicesList(),否则权限通过后不会自动加载设备列表:@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_BLUETOOTH_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { pairedDevicesList(); } } } - 地址截取逻辑隐患:若设备名称长度不足17位,
info.substring(info.length()-17)会抛出字符串越界异常,导致点击列表项崩溃,建议改为直接通过BluetoothDevice获取地址,而非从名称字符串截取。
三、蓝牙权限适配问题
- 高版本权限缺失:Android 12(API 31)及以上需申请
BLUETOOTH_CONNECT权限,仅申请BLUETOOTH无法获取绑定设备列表。需更新权限请求数组:ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_BLUETOOTH_PERMISSION); - Manifest权限声明:确保AndroidManifest.xml中已添加必要权限:
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-feature android:name="android.hardware.bluetooth" android:required="true" />
四、快速验证步骤
- 临时修改布局,移除ListView的marginStart并添加正确约束,运行查看列表是否显示。
- 在
pairedDevicesList()中添加日志:Log.d("Bluetooth", "Paired devices: " + pairedDevices.size());,确认是否获取到绑定设备。 - 检查设备蓝牙是否开启,且HC-05已与手机成功配对。
内容的提问来源于stack exchange,提问作者zrunchi
相关产品推荐
相关产品推荐

