Другим способом было бы переопределить onPrepareDialogBuilder ListPreference и инициализировать setSingleChoiceItems AlertDialog.Builder непосредственно с помощью вашего адаптера:
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 );
}
}
Если вы посмотрите на исходники Android, вы обнаружите, что onPrepareDialogBuilder () действительно вызывает:
public AlertDialog.Builder setSingleChoiceItems (CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener)
с этими входными массивами. Чтобы сделать ListPreference с помощью какого-либо адаптера (например, ArrayAdaper, CursorAdapter), вам просто нужно позвонить:
public AlertDialog.Builder setSingleChoiceItems (ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener)
вместо.
Таким образом, ListPreference будет работать непосредственно с адаптером, и вам не нужно копировать данные из адаптера, чтобы поместить их в массивы записей.
Найти рабочий образец здесь .