【问题标题】:Bluetooth devices discovery and custom list adapter蓝牙设备发现和自定义列表适配器
【发布时间】: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


【解决方案1】:
  1. 要使ListView 显示添加的项目,您必须告诉ListVIew 它的列表中有更新:在rowItemsDevices.add(items); 之后添加yourAdapter.notifyDataSetChanged()。没有它ListView 会更新知道他已经有一些项目要绘制。
  2. 现在的项目是重复的,因为您注册了新的BroadcastReceiver,并且不要取消注册旧的。如果您尝试第三次运行您的方法,您将获得 3 份项目。所以你必须在扫描完成后注销接收器:

    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
    }
    

【讨论】:

  • 一个注意事项,根据文档 notifyDataSetChanged 应该在适配器而不是 ListView 上调用
  • @jacek_podwysocki,是的,你是对的。我只是在IDE中没有写代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2012-04-19
  • 1970-01-01
  • 2017-03-17
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多