¿Es posible cargar elementos ListPreference desde un adaptador?

Me propongo crear una actividad de configuración para mi aplicación. He definido una PreferenceActivity con un diseño agradable que incluye un objeto ListPreference para que el usuario seleccione un dispositivo bluetooth. Tengo problemas para rellenar dinámicamente la lista .

Me gustaría rellenar ListPreference con los valores de un adaptador de matriz (que crearé y relleno con los nombres de dispositivos Bluetooth relevantes).

Si esto fuera un spinner View, podría simplemente llamar a setAdapter() . Sin embargo, con el objeto ListPreference no puedo averiguar cómo adjuntar un adaptador ( findviewByID no emitirá desde View To ListPreference , por lo que ni siquiera puedo obtener un identificador para el objeto).

Me gustaría adjuntar un adaptador y luego rellenar el adaptador con valores, que a su vez se llenar el ListPreference con valores.

ListPreference no funciona con adaptadores, funciona con cadenas. Consulte setEntries() y setEntryValues()

Para llegar a ListPreference , llame a findPreference() en su PreferenceActivity . ListPreference la Preference que regresa a ListPreference .

Para el caso especial de una lista de dispositivos bluetooth, puede utilizar la siguiente clase:

 package de.duenndns; import android.bluetooth.*; import android.content.Context; import android.preference.ListPreference; import android.util.AttributeSet; import java.util.Set; public class BluetoothDevicePreference extends ListPreference { public BluetoothDevicePreference(Context context, AttributeSet attrs) { super(context, attrs); BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = bta.getBondedDevices(); CharSequence[] entries = new CharSequence[pairedDevices.size()]; CharSequence[] entryValues = new CharSequence[pairedDevices.size()]; int i = 0; for (BluetoothDevice dev : pairedDevices) { entries[i] = dev.getName(); if (entries[i] == null) entries[i] = "unknown"; entryValues[i] = dev.getAddress(); i++; } setEntries(entries); setEntryValues(entryValues); } public BluetoothDevicePreference(Context context) { this(context, null); } } 

Puede estar involucrado directamente desde su XML prefs para almacenar el MAC como cadena de prefs:

 <de.duenndns.BluetoothDevicePreference android:key="bluetooth_mac" android:title="Bluetooth Device" android:dialogTitle="Choose Bluetooth Device" /> 

Sólo una actualización de este caso en caso de que alguien viene, la respuesta ge0rg funciona, pero lo cambió un poco para tener en cuenta las preferencias múltiples y no sólo el bluetooth y también si no tienen ningún dispositivo emparejado configurado para que usted no recibe un error Con una matriz nula.

 ListPreference BTList = (ListPreference) findPreference("your preference key"); BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); CharSequence[] entries = new CharSequence[1]; CharSequence[] entryValues = new CharSequence[1]; entries[0] = "No Devices"; entryValues[0] = ""; if(pairedDevices.size() > 0){ entries = new CharSequence[pairedDevices.size()]; entryValues = new CharSequence[pairedDevices.size()]; int i=0; for(BluetoothDevice device : pairedDevices){ entries[i] = device.getName(); entryValues[i] = device.getAddress(); i++; } } BTList.setEntries(entries); BTList.setEntryValues(entryValues); 

`Espero que esto ayude a alguien … oh y esto se pone bajo el método onCreate para la actividad de preferencia

Otra forma sería anular onPrepareDialogBuilder de ListPreference y inicializar setSingleChoiceItems de AlertDialog.Builder directamente con su adaptador:

 public class AdapterListPreference extends ListPreference { @Override protected void onPrepareDialogBuilder( AlertDialog.Builder builder ) { // don't call super.onPrepareDialogBuilder() because it'll check // for Entries and set up a setSingleChoiceItems() for them that // will never be used final ListAdapter adapter = …; builder.setSingleChoiceItems( adapter, 0, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which ) { // adapter.getItemId( which ) dialog.dismiss(); } } ); builder.setPositiveButton( null, null ); } } 

Si miras las fuentes de Android, verás que onPrepareDialogBuilder () llama:

 public AlertDialog.Builder setSingleChoiceItems (CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener) 

Con esos arrays de entrada. Para hacer que ListPreference utilice algún adaptador (por ejemplo, ArrayAdaper, CursorAdapter), sólo tiene que llamar a:

 public AlertDialog.Builder setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) 

en lugar.

De esta manera ListPreference funcionará directamente en el adaptador y no es necesario copiar los datos del adaptador para colocarlos en las matrices de entradas.

Encuentre aquí una muestra de trabajo.

  • ¿Cómo cambiar el tamaño del texto del mensaje de preferencia del diálogo?
  • ¿Cómo puedo crear una preferencia con un EditTextPreference y un Togglebutton?
  • Escapar% en las preferencias de ICS - ¿Realmente tengo que escribir la manipulación de versiones específicas de la cadena?
  • Preferencias sin métodos obsoletos
  • Cómo crear grupos de encabezados de preferencia en Android PreferenceActivity?
  • Iniciar una actividad desde preferences.xml
  • Hacer que Preferencia parezca deshabilitada, pero sigue registrando clics
  • Android: inicia una preferencia personalizada desde una preferenciaActividad
  • Cómo eliminar PreferenceCategory de forma programática?
  • Cambio de una preferencia 'Resumen
  • Cómo establecer varios valores predeterminados en un MultiSelectListPreference?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.