2016-04-19 10 views
7

Ho una preferenza personalizzata che contiene due listpreferenze personalizzate. A causa della natura dinamica delle due liste, ogni volta che il mio frammento genitore viene caricato, ho aggiornare questi due frammenti creando una nuova istanza della preferencefragment personalizzato:Scorrere fino a/impostare la posizione della preferenza dell'elenco personalizzato

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

Questo funziona perfettamente e rende le preferenze di elenco personalizzato. Ognuna di queste due preferenze della lista sono definiti da un listpreference personalizzato:

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

mio listpreference personalizzato è per lo più lì per fare alcune operazioni prima di creare la finestra di dialogo, in modo che la priorità che il metodo:

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

Tutto funziona ottimo dall'inizio alla fine, ma quando gli elenchi diventano abbastanza lunghi, lo scorrimento diventa un problema poiché il popup dell'elenco non scorre automaticamente fino all'elemento preferenza selezionato.

Tutti i post sul Web relativi a questo problema presuppongono che è possibile ottenere il listview sottostante per id e basta fare lo scroll semplice (o simile) per passare alla voce di elenco corretta. Tuttavia, nel mio caso, non esiste un id della vista elenco, quindi non posso farvi riferimento (almeno dalla mia conoscenza limitata). C'è qualche modo per farlo?

risposta

0

Il ListPreference utilizza AlertDialog.Builder.setSingleChoiceItems(), che garantisce che l'elemento attualmente selezionato sia visibile. Quindi, nel tuo caso sostituire

builder.setAdapter(listAdapter, this); 

con:

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

Grazie per il suggerimento - l'elenco sembra avere la stessa funzionalità anche se purtroppo. Viene ancora visualizzato all'inizio dell'elenco e richiede lo scorrimento verso il basso per visualizzare l'elemento selezionato. – runfaj

+0

Strana, l'unica differenza che posso vedere con il tuo caso è che ho sottoclasse 'DialogPreference' invece di' ListPreference', perché ho avuto problemi con il modo in cui 'ListPreference' gestisce gli elenchi di etichette e valori – bwt

Problemi correlati