我有一个应用程序,按下按钮(切换按钮)按下扫描并在自定义列表视图中显示发现的蓝牙设备,再次按下相同的按钮则停止扫描。
现在当我再次按下按钮(第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;
}
}
答案 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地址并从列表中删除重复的设备。