もう1つの方法は、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はアダプター上で直接動作し、エントリー配列にデータを入れるためにアダプターからデータをコピーする必要はありません。
ここで実用的なサンプルを見つけてください。