7

私は、2つのカスタムlistpreferencesを含むカスタムpreferencefragmentを持っています。二つのリストの動的な性質のために、私の親の断片がロードされるたびに、私は、カスタムpreferencefragmentの新しいインスタンスを作成することによって、これら2つの断片をリフレッシュ:カスタムリストプリファレンスの位置をスクロール/セットする

if(themeListFragment != null) { 
    themeListFragment = new ThemeListFragment(); 
    //init fragment 
    getFragmentManager().beginTransaction() 
      .replace(R.id.themeFragmentCont, themeListFragment) 
      .commit(); 
} 

これは完璧に動作し、カスタムリストのプリファレンスをレンダリングします。

@Override 
protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 
    int index = preferences.getInt(getContext().getString(R.string.theme_id),getContext().getResources().getInteger(R.integer.default_theme_id)); 

    System.out.println(index); 

    ListAdapter listAdapter = new ThemeListAdapter(getContext(), 
      R.layout.image_list_row, this.getEntries(), 
      themes, index, 
      this); 

    builder.setAdapter(listAdapter, this); 

    super.onPrepareDialogBuilder(builder); 
} 

すべての作品:それはそのメソッドをオーバーライドするので、私のカスタムlistpreferenceは、ダイアログを作成する前に、いくつかの操作を行うには、ほとんどあり

//setup themes list 
if(lp == null) { 
    lp = (ThemeListPreference) findPreference("theme_list"); 
    lp.setOnPreferenceChangeListener(this); 
    refreshThemes(); 
} 

:これら2人のリストの好みがカスタムlistpreferenceによって定義された各リストの長さが長くなると、リストのポップアップが選択されたプリファレンス項目に自動スクロールしないため、スクロールが問題になります。

この問題のWeb上の投稿はすべて、IDで基になるリストビューを取得し、スムーズなスクロール(またはそれに類似)を行い、適切なリスト項目にジャンプできると想定しています。しかし、私の場合、リストビューIDはないので、私はそれを参照することはできません(少なくとも私の限られた知識から)。これを行う方法はありますか?

答えて

0

ListPreferenceは、現在選択されている項目が確実に表示されるようにAlertDialog.Builder.setSingleChoiceItems()を使用します。だから、あなたのケースにして

builder.setAdapter(listAdapter, this); 

を置き換える:

builder.setSingleChoiceItems(listAdapter, index, this); 
+0

提案をありがとう - リストは、残念ながらしかし、まったく同じ機能を持っているように見えます。それでもリストの一番上に表示され、選択された項目を見るためにスクロールダウンする必要があります。 – runfaj

+0

奇妙なことに、私があなたのケースで見ることができる唯一の違いは、 'ListPreference'がラベルと値のリストを扱う方法に問題があったため、' ListPreference'の代わりに 'DialogPreference'をサブクラス化したことです – bwt