Khotmanish,
Non sono sicuro di cosa si intende per il più efficiente modo. Ci sono molti modi che sono molto veloci, ma spesso dipende da ciò che sai in anticipo e da ciò che non sai.Si deve anche capire che le proprietà della vista dinamica sono pesantemente fraintese, ma altamente efficienti nonostante i miti popolari. Le persone di Google hanno fatto un ottimo lavoro nello sviluppo dell'interfaccia utente.
Se lo conosci in anticipo, puoi semplicemente creare un oggetto StateListDrawable per ciascuna vista e applicarlo a ciascuno mentre esegui l'adattatore.
Per costruire la vostra StateListDrawable, crearne uno:
StateListDrawable _drawStates;
Poi, per ogni stato, aggiungere il drawable è necessario:
_drawStates.add(new int[] {android.R.attr.state_pressed}, _newImage);
Questa è semplice come la seguente riga nel vostro GetView () metodo per il tuo adattatore:
v.setBackgroundDrawable(_drawStates);
In alternativa, è possibile modificare gli sfondi in modo dinamico secondo la selezione. Questo può essere fatto in OnListItemClick()
. Vedete, OnListItemClick()
vi darà la visualizzazione esatta su cui è stato fatto clic. Una volta che avete questo, è possibile trovare il bambino dal suo id
e modificare le sue proprietà e invalidate()
esso. Uso questo trucco molto. Mi risparmia molta memoria, ma non sto facendo nulla di veramente intensivo sul processore. È possibile modificare quasi tutte le proprietà qui senza quasi alcuna elaborazione. Ecco un esempio:
@Override protected void onListItemClick(final ListView inList, final View v, final int atPos, final long rowID)
{//Get the Child, set the properties
ImageView _img = (ImageView)(v.findViewById(R.id.app_package));
_img.setBackgroundColor(myClickedColor);
_img.invalidate(); // <---- BEST Option
// ... OR ...
v.invalidate(); // <---- 2nd Best Option
// ... OR ...
inList.invalidate(); // <---- Last resort or specialized implementation
}
E 'importante notare che questa operazione ha dinamicamente alcuni avvertimenti quando si tratta di colori di sfondo. È NECESSARIO prelevare il bambino dalla vista selezionata ... Non da ListView. In secondo luogo, quando si cambiano i colori di sfondo, si stanno infatti modificando i Drawable di sfondo. Questo significa che tutte le altre proprietà "stateful" vanno via e devi cambiarle manualmente (se vuoi che inizi).
Ora, un approccio più popolare, ma un po 'meno flessibile è quello di creare il tuo StateListDrawable in XML. Ci sono un certo numero di risorse per imparare come farlo sul sito web degli sviluppatori Android.
Spero che questo aiuti, FuzzicalLogic
"AFAIK non è possibile applicare gli stili nel selettore. C'è un modo migliore di lavorare su questo invece di gestire il codice java?" Se non puoi farlo in un selettore, in quale altro modo potrebbe essere fatto, ma in Java? Forse potresti scavalcare gli attributi di stile indicati dal selettore predefinito? – nmr
Gli stili possono essere applicati per modificare il colore di sfondo/disegnabile. Non sarebbe utile cambiare la dimensione del carattere. Inoltre ho bisogno di specificare il selettore per ciascuna delle viste figlio? Nel codice java come in, all'interno di getView(). –