蓝牙设备发现和自定义列表适配器

问题描述:

我试图检索可见蓝牙设备的列表并使用自定义适配器将收集的信息传递给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(); 

} 

日志显示设备已正确发现: enter image description here

为了排除这个问题在我的自定义的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引起的,由于某种原因,第二次搜索时,addz以前发现了新设备。如何解决它? enter image description here

+1

尝试调用'yourListView.notifyDataSetChanged()''后rowItemsDevices.add(项目);'。据我所知,你不告诉你的ListView它是一些新的数据显示。它不会自动监视源代码集合 –

+0

确实有助于刷新ListView,但其中存在重复项目的问题仍然存在。请参阅我的编辑 –

+1

看起来您只是在扫描完成后才取消注册旧接收器。尝试使用: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 }' –

  1. 为了ListView显示添加的项目,你一定要告诉ListVIew的东西被更新在它的列表:rowItemsDevices.add(items);之后添加yourAdapter.notifyDataSetChanged()。没有它ListView会更新知道他已经有一些项目绘制。
  2. 由于您注册新的BroadcastReceiver,因此这些项目现在会被复制,并且不会取消注册旧项目。如果你尝试第三次运行你的方法,你会得到三件式的物品。所以,你必须扫描完成后,注销接收器:

    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 line 
    } 
    
+0

一个说明,根据文档notifyDataSetChanged应该在适配器上调用,而不是在ListView –

+0

@jacek_podwysocki,你说得对。我只是写了代码不在IDE中 –