另一种方法是覆盖ListPreference的 onPrepareDialogBuilder 并使用您的适配器直接初始化AlertDialog.Builder的 setSingleChoiceItems :
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 将直接对适配器进行操作,您无需从适配器复制数据以将它们放入条目数组中。
在这里找到一个工作样本。