2016-04-19 273 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