Listview显示重新扫描的蓝牙设备的重复条目

时间:2013-01-23 12:16:57

标签: android listview bluetooth

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

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

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

以下是代码

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

    });

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

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

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

简单的实施是显示here

答案 2 :(得分:0)

如果您无法使用默认的listview适配器,就像您想要在对话框片段中显示设备一样,这是我不太优雅的解决方案,以避免在重新扫描时出现相同设备的重复:

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

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

答案 3 :(得分:0)

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

移除onclick中的接收器并将其放在oncreate下

答案 4 :(得分:0)

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

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
    }

答案 5 :(得分:0)

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