私は可視の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();
}
私のカスタムリストビューアダプタ自体にある問題の原因を排除するためにリストビューに要素を追加すると正しく動作することを証明するテスト関数を作成しました:
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回目の検索で以前に発見されたデバイスを新しい検索に追加します。それを修正するには?
呼び出してみてください 'yourListView.notifyDataSetChanged()' 'rowItemsDevices.add(項目)の後に、'。私の知る限り、ListViewに表示する新しいデータはありません。あなたのソースコレクションを自動的に監視しません –
実際にListViewをリフレッシュするのに役立ちましたが、重複するアイテムの問題は残ります。私の編集を参照してください –
あなたはちょうどスキャンが終了した後古いレシーバの登録を解除しないように見えます。 'else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ general.log(" BT "、"デバイス検索が完了しました ");general.log( "BT"、 "end list size:" + rowItemsDevices.size()); unregisterReceiver(this); //これを追加します } –