I have an app, which on button (toggle button) press scans and displays discovered bluetooth devices in a custom listview, and on pressing the same button again the scanning is stopped.
Now the problem shows up when I press the button again (2nd time) to start scanning, the same device is shown twice. After I stop and start scanning (3rd time), the same device is shown thrice. And the discovered devices were never paired with my android phone.
There is a similar question, but the answer didn’t help me. Please let me know where I have gone wrong.
Below is the code
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();
}
}
});
I have two more classes which does the customization of listview, could there be anything to avoid the duplicate entries. Below is the code of first class file
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;
}
}
The second class file
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;
}
}
Customizing the listview with the kind of logic used above has created redundancy and duplicate entries are created. So instead of writing custom listview with two additional classes, we could go for the ArrayAdapter with simple_list_item_1.
In the Button onclick event ArrayAdapter object would clear the duplicate entries, and the simple_list_item_1 would provide two rows listview similar to the custom listview.
SImple implementation is show here