2016-11-21 5 views
0

私は可視のBluetoothデバイスのリストを取得し、収集した情報をカスタムアダプタを使用してListViewに渡そうとしています。 私の機能の唯一の問題点は、発見されたアイテム(デバイス)をListViewに追加することです。異なるアプローチを試している間に、ListViewはまったく取り込まれず、アイテムは上書きされたり、ListViewBluetoothデバイスのディスカバリとカスタムリストのアダプタ

私の現在の機能は、すべてのリストビューを移入しません:

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

私のカスタムリストビューアダプタ自体にある問題の原因を排除するためにリストビューに要素を追加すると正しく動作することを証明するテスト関数を作成しました:

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期待どおりに多分私はそれを実装している正しい方法ですか?

EDIT:

は私のアダプターにdevicesAdapter.notifyDataSetChanged()を追加した後、リストは最初の実行時に正しい値を示している、まだ私は再び機能を実行した場合、アイテムが重複になるので、それは私が持っていた同じ問題です始まり。ログを見ると、BroadcastReceiverが原因で問題が発生していることがわかります。これは何らかの理由で2回目の検索で以前に発見されたデバイスを新しい検索に追加します。それを修正するには? enter image description here

+1

呼び出してみてください 'yourListView.notifyDataSetChanged()' 'rowItemsDevices.add(項目)の後に、'。私の知る限り、ListViewに表示する新しいデータはありません。あなたのソースコレクションを自動的に監視しません –

+0

実際にListViewをリフレッシュするのに役立ちましたが、重複するアイテムの問題は残ります。私の編集を参照してください –

+1

あなたはちょうどスキャンが終了した後古いレシーバの登録を解除しないように見えます。 'else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ general.log(" BT "、"デバイス検索が完了しました ");general.log( "BT"、 "end list size:" + rowItemsDevices.size()); unregisterReceiver(this); //これを追加します } –

答えて

2
  1. ListViewショー追加された項目を作成するには、何かがそれのリストに更新されるListVIewを伝える必要があり:rowItemsDevices.add(items);yourAdapter.notifyDataSetChanged()を追加します。それがなければListViewは彼が既にいくつかのアイテムを持っていることを知っているでしょう。
  2. 新しいBroadcastReceiverを登録し、古いものを登録しないので、アイテムが複製されます。 3回目の方法を実行しようとすると、3つのplicatedアイテムが表示されます。だから、スキャン終了後に受信機の登録を解除する必要があります。

    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でないコードを書いた –

関連する問題