2016-04-19 38 views
7

我有一個自定義preferencefragment,其中包含兩個自定義列表首選項。由於兩個列表的動態性質,我的每一位家長片段被加載時,我通過創建自定義preferencefragment的新實例刷新這兩個片段:滾動到/設置自定義列表首選項的位置

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

這完美的作品,並呈現自定義列表的喜好。這兩個名單偏好每個由自定義listpreference定義:

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

我定製listpreference幾乎已經創建對話框之前做一些操作,因此它將覆蓋方法:

@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); 
} 

一切正常從開始到結束都很棒,但是當列表變得足夠長時,滾動成爲一個問題,因爲列表彈出不會自動滾動到所選的首選項。

針對此問題的所有網絡帖子均假設您可以通過id獲取基礎列表視圖,只需執行平滑滾動(或類似)即可跳轉到正確的列表項目。然而,在我的情況下,沒有一個列表視圖ID,所以我不能引用它(至少從我有限的知識)。有沒有可能的方法來做到這一點?

回答

0

ListPreference使用AlertDialog.Builder.setSingleChoiceItems(),它確保當前選擇的項目可見。所以,你的情況替換

builder.setAdapter(listAdapter, this); 

有:

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

感謝您的建議 - 名單似乎有但不幸的完全相同的功能。它仍然在列表頂部呈現,並且需要向下滾動才能看到選定的項目。 – runfaj

+0

奇怪的是,我可以看到你的情況唯一的區別是我分類'DialogPreference'而不是'ListPreference',因爲我有'ListPreference'處理標籤和值列表的方式問題 – bwt