1

我有一个应用程序,它在按钮(切换按钮)上按下扫描并在自定义列表视图中显示发现的蓝牙设备,然后再次按下相同的按钮,扫描停止。

现在,当我再次按下按钮(第二次)开始扫描时,问题出现了,同一设备显示了两次。在我停止并开始扫描(第三次)后,同一设备显示三次。并且发现的设备从未与我的安卓手机配对。

有一个类似的问题,但答案对我没有帮助。请让我知道我哪里出错了。

下面是代码

        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();
            }
        }

    });

我还有两个自定义列表视图的类,是否有什么可以避免重复条目。下面是第一类文件的代码

 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;
}

}

第二类文件

 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

当您开始重新扫描时,清除列表“获取”中的项目。基本上,您所做的是,每次扫描时,您都会将蓝牙搜索到的设备添加到以前的列表中。

于 2013-01-23T12:22:29.213 回答
0

使用上面使用的逻辑自定义列表视图会创建冗余并创建重复条目。因此,我们可以使用带有 simple_list_item_1 的 ArrayAdapter,而不是编写带有两个附加类的自定义列表视图。

在 Button onclick 事件中,ArrayAdapter 对象将清除重复的条目,simple_list_item_1 将提供类似于自定义列表视图的两行列表视图。

简单的实现在这里显示

于 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++;
        }
    }
};

基本上,您检查设备是否先前被扫描过。但是,这仅在只有一个设备(对于我的应用程序)时才有效,但是如果您需要适应许多设备,则需要存储所有以前的地址并像查找一样解析它们并只显示新的地址。

于 2014-08-10T23:40:28.033 回答
0

我有同样的问题。只需将接收器放在 onclick 之外,在 oncreate 下。由于它在 onclick 下,接收器被初始化两次,因此是重复的设备。

把onclick里面的receiver去掉,放到oncreate下

于 2014-10-24T03:46:14.947 回答
0

您需要清除在适配器中使用的列表。像这样->

private fun setAdapterToListView() {

        devicesNameAddressList.clear()
        for (i in 0 until devicesName.size) {
            val list = HashMap<String, String>()
            list.put("line1", devicesName[i])
            list.put("line2", devicesAddress[i])
            devicesNameAddressList.add(list)
        }

        val simpleAdapter = SimpleAdapter(this, devicesNameAddressList, R.layout.devices_listview_texttype,
                arrayOf("line1", "line2"), intArrayOf(R.id.line_a, R.id.line_b))
        BluetoothDevicesListID.adapter = simpleAdapter
    }
于 2017-10-11T05:55:38.340 回答
0

对于有mac地址的蓝牙设备,您可以匹配mac地址并从列表中删除重复的设备。

于 2017-10-11T05:58:11.437 回答