2012-10-12 14 views
6

Nella mia applicazione ho un riquadro sinistro che contiene una vista elenco. La selezione effettuata in questa visualizzazione elenco, quindi, richiede i dati rilevanti, che aggiornano il riquadro destro e altri collegamenti ed elementi nell'attività. A causa di questo disegno, il riquadro sinistro deve sempre avere una selezione fatta per dare il resto dei valori utili all'attività.Android: impostazione di un elemento listview con clic programmato sullo stato selezionato

Nel metodo onCreate della mia attività chiamo il seguente comando per selezionare il primo elemento nell'elenco per impostazione predefinita. (Programlist è il mio ListView)

programList.performItemClick(programList, 0, programList.getItemIdAtPosition(0); 

che tutte le opere grandi e carichi vista come previsto con i valori giusti, tranne una cosa.

Ho aggiunto un selettore per la lista che evidenzia l'elemento selezionato. Quando l'elemento viene fisicamente cliccato nell'emulatore evidenzierà (sto usando CHOICE_MODE_SINGLE), ma non evidenzia sulla chiamata performItemClick(). Ho cercato aiuto su StackOverflow e ho cercato di utilizzare quanto segue prima del clic, ma non ha fatto la differenza.

programList.requestFocusFromTouch(); 
    programList.setSelection(0); 

Dalla lettura del API suona come il metodo setSelection non imposta lo stato della voce in un'interfaccia touch, e dai miei risultati sembra che il metodo performItemClick non lo fa neanche. Ho anche cercato di usare

programList.getAdapter().getView(0, null, null).setSelected(true); 

Allora posso leggere lo stato della vista testo e vedere che è stato selezionato, ma anche fatto nulla per cambiare ciò che viene visualizzato sullo schermo.

C'è qualcosa nel onCreateMethod che impedisce di disegnare in modo diverso lo stato del pulsante? Ho provato a invalidare il drawable all'interno della singola visualizzazione del testo e invalidare la visualizzazione del testo stesso, ma ciò non ha aiutato. Ho anche provato a cambiare lo sfondo della vista del testo, ma sembra che il selettore che ho impostato lo governa o sia disegnato in primo piano. So di avere la corretta visualizzazione di testo perché ho usato getText per leggere cosa c'è dentro.

Se qualcuno è in grado di aiutarmi con questo problema o indicarmi una soluzione, sarebbe molto apprezzato.

risposta

4

Il trucco è di ignorare il metodo getView() dell'adattatore. Prova questo:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final View renderer = super.getView(position, convertView, parent); 
    if (position == index_of_selected_item) { 
     renderer.setBackgroundResource(android.R.color.darker_gray); 
    } 
    return renderer; 
} 

Naturalmente, è possibile impostare il colore di sfondo per qualsiasi colore che ti piace per indicare che è la voce "attivo".

+0

Grazie. C'è un modo per farlo funzionare usando il metodo listview.setSelector(), o dovrò impostare il resto dei miei stati usando getView() Il setSelector è molto più conveniente dal momento che è solo una risorsa xml. Vorrei sapere cosa succede in modo diverso quando clicco con il mouse sull'emulatore e cosa succede quando chiamo l'evento click in modo programmatico. – ndw

+0

Ciò non mi consente di deselezionare mai l'elemento, anche se aggiungo altro alla tua istruzione e impostato sull'altro colore. La visualizzazione Get viene chiamata inizialmente solo quando viene caricata la vista. Una volta impostato lo sfondo per l'elemento della vista elenco, rimarrà tale. [questo] (http://stackoverflow.com/questions/10296846/android-listview-select-first-item-after-loading-datas) mi ha ottenuto più vicino, ma la sua spiegazione è incompleta. – ndw

+2

Come posso ottenere il valore index_of_selected_item – Dimitri

Problemi correlati