【发布时间】:2016-11-21 11:14:29
【问题描述】:
我正在尝试检索可见蓝牙设备的列表,并使用自定义适配器将收集到的信息传递给 ListView。 我的函数中唯一有问题的部分是将发现的项目(设备)添加到 ListView,在测试不同的方法时,ListView 根本没有填充,项目被覆盖或项目在 ListView 中重复。
我当前的函数根本没有填充 ListView:
public void startDevicesDiscovery(){
rowItemsDevices.clear();
devicesAdapter =new DevicesListAdapter(tContext, rowItemsDevices);
//cancel discovery if discovering
if (mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
}
general.log("BT","start list size: "+rowItemsDevices.size());
bluetoothReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
General general = new General(tContext);
String action = intent.getAction();
// if device found
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(btDevice == null){
general.log("BT","device NULL");
}else{
Device device = new Device(btDevice.getName(),btDevice.getAddress());
general.log("BT","device: "+device.getDeviceName()+"\ndevice MAC: "+device.getMacAddress());
RowItemDevices items = new RowItemDevices(device.getDeviceName(),device.getMacAddress());
rowItemsDevices.add(items);
devicesAdapter.notifyDataSetChanged();
}
}else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
general.log("BT","device search finished");
general.log("BT","end list size: "+rowItemsDevices.size());
}
}
};
visibleDevices.setAdapter(devicesAdapter);
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(bluetoothReceiver, filter);
mBluetoothAdapter.startDiscovery();
}
为了排除问题的原因在于我的自定义 ListView 适配器本身,我创建了一个测试函数来证明向我的 ListView 添加元素可以正常工作:
public void testListView(){
general.log("BT","testListView");
rowItemsDevices.clear();
devicesAdapter =new DevicesListAdapter(tContext, rowItemsDevices);
RowItemDevices items = new RowItemDevices("test 1","test sub 1");
rowItemsDevices.add(items);
RowItemDevices items2 = new RowItemDevices("test 2","test sub 2");
rowItemsDevices.add(items2
);
visibleDevices.setAdapter(devicesAdapter);
}
有什么想法吗?看起来函数 startDevicesDiscovery 可以按预期工作,但也许我没有以正确的方式实现它?
编辑:
在我的适配器上添加devicesAdapter.notifyDataSetChanged() 后,列表在第一次运行时显示正确的值,但如果我再次运行该函数,项目会重复,所以这与我一开始遇到的问题相同。通过查看日志,我可以看到问题是由 BroadcastReceiver 引起的,由于某种原因,在第二次搜索时,将先前发现的设备添加到新搜索中。如何解决?
【问题讨论】:
-
尝试在
rowItemsDevices.add(items);之后调用yourListView.notifyDataSetChanged()。据我所知,您不会告诉您的 ListView 有一些新数据要显示。它不会自动监控您的源集合 -
它确实有助于刷新 ListView,但其中重复项目的问题仍然存在。请看我的编辑
-
看起来您只是没有在扫描完成后取消注册旧接收器。尝试使用这个:
else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ general.log("BT","device search finished"); general.log("BT","end list size: "+rowItemsDevices.size()); unregisterReceiver(this);//add this } -
完美,取消注册的接收器完成了这项工作。请将其添加为答案,以便我可以将其标记为我的问题的已接受答案
标签: android bluetooth broadcastreceiver listadapter