2015-05-12 2 views
1

В моем приложении для Android у меня есть ListActivity, который отображает устройства Bluetooth. У меня есть ArrayList<BluetoothDevice> и ArrayAdapter<BluetoothDevice>. Все работает, но есть одна проблема. Каждый BluetoothDevice отображается как MAC-адрес в списке, но мне нужно отобразить его имя.Переопределить метод toString() конечного класса BluetoothDevice

Как я знаю адаптер звонки toString способ на каждый объект. Но BluetoothDevice возвращает MAC-адрес, если вы вызываете его toString. Таким образом, решение было бы переопределить toString и вернуть имя вместо адреса. Но BluetoothDevice - последний класс, поэтому я не могу его переопределить!

Любые идеи о том, как заставить Bluetooth-устройство вернуть свое имя вместо адреса? toString?

+1

Продлить ArrayAdapter и использовать другой метод внутри адаптера вместо ToString – Zelldon

+0

Я думаю, что это самое лучшее решение. Благодаря! – DanielH

+0

thx для ответа - я добавил свой комментарий как ответ – Zelldon

ответ

1

Как я уже упоминал в комментариях вы можете расширить ArrayAdapter и использования другой метод вместо метода toString.

Для примера вот так:

public class YourAdapter extends ArrayAdapter<BluetoothDevice> { 
    ArrayList<BluetoothDevice> devices; 
    //other stuff 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //get view and the textView to show the name of the device 
    textView.setText(devices.get(position).getName()); 
    return view; 
} 
} 
2

После того, как у вас есть ArrayList

ArrayList<BluetoothDevice> btDeviceArray = new ArrayList<BluetoothDevice>(); 
ArrayAdapter<String> mArrayAdapter; 

Теперь вы можете добавить устройства в onCreateView, например:

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
mArrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_1); 
     setListAdapter(mArrayAdapter); 

Set<BluetoothDevice> pariedDevices = mBluetoothAdapter.getBondedDevices(); 
     if(pariedDevices.size() > 0){ 
      for(BluetoothDevice device : pariedDevices){ 
       mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
       btDeviceArray.add(device); 
      } 
     } 

Так, обратите внимание, что вы можете получить имя с помощью метода .getName(). Это решит вашу проблему?

+0

Но ArrayList и ArrayAdapter должны содержать объекты того же типа. В вашем предложении ArrayList содержит объекты BluetoothDevice, а ArrayAdapter содержит объекты String. Это вызывает ошибку ... – DanielH

3

вы могли бы использовать композицию вместо наследования:

public static class MyBluetoothDevice { 
    BluetoothDevice mDevice; 
    public MyBluetoothDevice(BluetoothDevice device) { 
     mDevice = device; 
    } 

    public String toString() { 
      if (mDevice != null) { 
      return mDevice.getName(); 
      } 
      // fallback name 
      return ""; 
    } 
} 

и, конечно, ваш ArrayAdapter будет использовать MyBluetoothDevice вместо BluetoothDevice

+0

Да, это может быть решение. Но я использую много методов и полей из BluetoothDevice, поэтому я бы реализовал все эти методы в классе MyBluetoothDevice ... – DanielH

+1

у вас мог быть getter, который возвращает объект 'BluetoothDevice' – Blackbelt

Смежные вопросы