1

ボタン(トグルボタン)を押すとスキャンされ、検出されたBluetoothデバイスがカスタムリストビューに表示されるアプリがあり、同じボタンをもう一度押すとスキャンが停止します。

もう一度ボタンを押して (2 回目) スキャンを開始すると問題が発生し、同じデバイスが 2 回表示されます。スキャンを停止して開始した後 (3 回目)、同じデバイスが 3 回表示されます。そして、発見されたデバイスは、私の Android フォンとペアリングされたことはありませんでした。

同様の質問がありますが、答えは役に立ちませんでした。どこが間違っているのか教えてください。

以下はコードです

        btOnOff.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(btOnOff.isChecked()){

                btAdapter.startDiscovery();
                setProgressBarIndeterminateVisibility(true);

                    bcReceiver = new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            // TODO Auto-generated method stub
                            String action = intent.getAction();
                            if(BluetoothDevice.ACTION_FOUND.equals(action)){
                                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                                deviceName = device.getName();
                                currentDateTime = DateFormat.getDateTimeInstance().format(new Date());

                                Custom data = new Custom(deviceName, currentDateTime);
                                fetch.add(data);

                                lv.setAdapter(cAdapter);

                            }else if(btAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                                btAdapter.startDiscovery();
                            }
                        }
                    };

                    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                    registerReceiver(bcReceiver, filter);
            } else {
                btAdapter.cancelDiscovery();
            }
        }

    });

リストビューのカスタマイズを行うクラスがさらに2つありますが、エントリの重複を避けるために何かありますか? 以下はファーストクラスファイルのコードです

 public class CustomAdapter extends ArrayAdapter<Custom>{

private ArrayList<Custom> entries;
private Activity activity;

public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Custom> entries) {
    super(a, textViewResourceId, entries);
    // TODO Auto-generated constructor stub
    this.entries = entries;
    this.activity = a;
}

public static class ViewHolder{
    public TextView tv1;
    public TextView tv2;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
    View v = convertView;
    ViewHolder holder;
    if(v == null){
        LayoutInflater vi = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.show_devices, null);
        holder = new ViewHolder();
        holder.tv1 = (TextView) v.findViewById(R.id.tv1);
        holder.tv2 = (TextView) v.findViewById(R.id.tv2);

        v.setTag(holder);
    }else{
        holder = (ViewHolder)v.getTag();
    }

    final Custom custom = entries.get(position);
    if(custom != null){
        holder.tv1.setText(custom.getFirst());
        holder.tv2.setText(custom.getSecond());
    }
    return v;
}

}

2 番目のクラス ファイル

 public class Custom {
private String text1;
private String text2;

public Custom(String string1, String string2){
    this.text1 = string1;
    this.text2 = string2;
}

public String getFirst(){
    return text1;
}

public void setFirst(String text1){
    this.text1 = text1;
}

public String getSecond(){
    return text2;
}

public void setSecond(String text2){
    this.text2 = text2;
}
 }
4

6 に答える 6

2

再スキャンを開始するときは、リストの「フェッチ」をクリアします..基本的に、スキャンするたびに、Bluetoothで検索されたデバイスを以前のリストに追加します..

于 2013-01-23T12:22:29.213 に答える
0

私も同じ問題を抱えていました。oncreate の下の onclick の外に受信機を置くだけです。onclick の下にあるため、レシーバーは 2 回初期化されているため、デバイスが重複しています。

onclick でレシーバーを削除し、oncreate の下に置きます

于 2014-10-24T03:46:14.947 に答える
0

上記で使用した種類のロジックでリストビューをカスタマイズすると、冗長性が生じ、重複したエントリが作成されます。したがって、2 つの追加クラスを使用してカスタム リストビューを記述する代わりに、simple_list_item_1 を使用して ArrayAdapter を使用できます。

ボタンの onclick イベントでは、ArrayAdapter オブジェクトが重複するエントリをクリアし、simple_list_item_1 がカスタム リストビューに似た 2 行のリストビューを提供します。

簡単な実装をここに示します

于 2013-01-25T18:33:22.550 に答える
0

デバイスをダイアログフラグメントに表示したいなど、デフォルトのリストビューアダプターを使用できない場合は、再スキャン時に同じデバイスの重複が表示されるのを避けるための、あまり洗練されていないソリューションを次に示します。

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if(count ==0){
              prev_device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
              mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
              mArrayAdapter.notifyDataSetChanged();
            }
            Log.d("BLUETOOTH","count = "+count);
            if(!device.getAddress().contains(prev_device.getAddress())){
                Log.d("BLUETOOTH","NOT A MATCH - ADD TO LIST");
            // Add the name and address to an array adapter to show in a ListView
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                mArrayAdapter.notifyDataSetChanged();
            }

            prev_device = device;

            if(count ==0){
                showDevices(); //Simply displays a dialogFragment with listview of devices
            }
            count++;
        }
    }
};

基本的に、デバイスが以前にスキャンされたかどうかを確認します。ただし、これは (私のアプリケーションでは) デバイスが 1 つしかない場合にのみ機能しますが、多くのデバイスに適合する必要がある場合は、以前のアドレスをすべて保存し、ルックアップのように解析して、新しいアドレスのみを表示する必要があります。

于 2014-08-10T23:40:28.033 に答える