Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿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).

  • Establecer el adaptador de vista de lista en un fragmento en android
  • El mejor lugar para añadirHeaderView en ListFragment
  • Android, ListView IllegalStateException: "El contenido del adaptador ha cambiado pero ListView no recibió una notificación"
  • Consenso sobre la carga lenta de mapas de bits en un adaptador (énfasis en Bitmap.recycle ())
  • Cómo obtener los elementos de la lista seleccionada de un Listview con checkBox y Adaptador personalizado?
  • Animar elementos recién agregados en ListView
  • 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.

  • Mensajes de QTAGUID del spam de proyecto Android phonegap
  • Cuadro de texto oculto debajo del teclado en la vista web de Android
  • Cuándo utilizar Enum / Int Constantes
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • Error al crear una aplicación Codename One grande durante la fase Dex
  • ¿Soporta Android Studio Maven?
  • 4 Solutions collect form web for “¿Es posible cargar elementos ListPreference desde un adaptador?”

    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.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.