7

У меня есть пользовательский фрагмент предпочтений, который содержит две пользовательские команды listpreferences. В связи с динамичным характером двух списков, каждый раз, когда мой родительский фрагмент загружается, я обновить эти два фрагмента, создавая новый экземпляр пользовательского 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); 
} 

все работает отлично от начала до конца, но когда списки получаются достаточно длинными, прокрутка становится проблемой, поскольку всплывающее окно списка не авто-прокрутки к выбранному элементу предпочтения.

Все сообщения в Интернете по этой проблеме предполагают, что вы можете получить базовое listview по id и просто сделать гладкую прокрутку (или подобное), чтобы перейти к соответствующему элементу списка. Однако в моем случае нет идентификатора списка, поэтому я не могу ссылаться на него (по крайней мере, из моих ограниченных знаний). Есть ли способ сделать это?

ответ

0

ListPreference использует AlertDialog.Builder.setSingleChoiceItems(), которые обеспечивают отображение текущего выбранного элемента. Таким образом, в вашем случае заменить

builder.setAdapter(listAdapter, this); 

с:

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

Спасибо за предложение - список, как представляется, имеют точно такую ​​же функциональность, хотя, к сожалению. Он по-прежнему отображается в верхней части списка и требует прокрутки вниз, чтобы увидеть выбранный элемент. – runfaj

+0

Странно, единственное отличие, которое я вижу в вашем случае, это то, что я подклассифицировал «DialogPreference» вместо «ListPreference», потому что у меня были проблемы с тем, как «ListPreference» обрабатывает списки меток и значений – bwt