2011-01-19 11 views
13

Leggere alcune domande correlate qui in SO, oltre a esaminare i documenti e l'origine di Android per cercare di capirlo, ma sono perplesso, sebbene considerato che il listSelector sembra applicarsi solo stili sugli elementi selezionati, non sto scioccato ...Elenco elenco di ListView Android non mostra lo sfondo degli articoli predefinito

ho un Listview definito main.xml qui:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fadingEdgeLength="5dp" 
    android:divider="#000000" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" /> 
    <TextView 
    android:id="@android:id/empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:singleLine="false" 
     android:text="@string/message_list_empty" /> 
</FrameLayout> 

il listSelector riferimento è qui (preso in prestito in gran parte dal elenco stato Android predefinito trovato nell'SDK: /android/platforms/android-8/data/res/drawable/list_selector_background.xml):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- the window has lost focus, disable the items --> 
    <item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are disabled --> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled and being pressed --> 
    <item 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 
    <item 
     android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 

    <!-- the list items are enabled and being used --> 
    <item 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_selected" /> 

    <!-- the default item --> 
    <item 
     android:drawable="@drawable/shape_row" /> 
</selector> 

I drawable fa riferimento sono le forme, rettangoli arrotondati, in questo modo:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
    <gradient 
     android:startColor="#EF6100" 
     android:centerColor="#FF8E00" 
     android:endColor="#EF6100" 
     android:angle="270" /> 
    <corners 
     android:bottomRightRadius="7dp" 
     android:bottomLeftRadius="7dp" 
     android:topLeftRadius="7dp" 
     android:topRightRadius="7dp" /> 
</shape> 

Quindi, il risultato finale dovrebbe essere un ListView con oggetti con uno sfondo @ drawable/shape_row per impostazione predefinita, e quindi diverso sfondi colorati a seconda dello stato. Quando apro il mio elenco, tutto funziona bene in termini di quando gli stati sono attivi, come ad esempio un elemento ottiene lo stato attivo, viene pressato, ecc, ma le voci si sono uno sfondo trasparente quando nessuno vengono selezionati (vale a dire lo stato di visualizzazione di default). Avevo sperato che l'ultima regola della lista Stato,

<item android:drawable="@drawable/shape_row" /> 

catturerebbe quello stato, ma per qualche motivo non funziona. Ho spostato le cose e provato diverse impostazioni e niente. Se modifico il file row.xml che io uso per definire le voci di elenco nella ListView e tenta di aggiungere un Android specifica: sfondo che punta a @ drawable/shape_row, ogni riga diventa lo sfondo corretto, ma il premuto, il fuoco, stati ecc. non riescono a elaborare (o almeno, non possono essere visti come lo sfondo non cambia mai).

Qualcuno mi può puntare nella giusta direzione qui? Sono così vicino a mettere questo a letto, ma dopo aver provato quasi tutto, non riesco a ottenere gli elementi ListView di prendere uno sfondo di default e rispondere alla lista di Stato concessi tramite Android: listSelector.

Grazie,

Paul

EDIT:

anche solo provato ad aggiungere Android: itemBackground = "@ drawable/shape_row" al ListView in main.xml, e non sorprende senza fortuna (la documentazione stato dovrebbe essere usato per specificare gli sfondi delle voci di menu, ma pensavo che valesse la pena provare con gli elementi della lista).

Un'altra cosa provato, aggiungendo android: visibile = "true" per ciascuna delle definizioni selettori e voce. I documenti StateListDrawable sembrano indicare che il "Provides initial visibility state of the drawable; the default value is false", ma aggiungendo questo non ha cambiato nulla.

EDIT2: Quindi, in base alla ricerca effettuata di seguito da Qberticus, sembra che possa esistere un solo set di selettori di elenchi per visualizzazione, che conferma il comportamento del selettore di elenchi. Posso anche confermare che l'impostazione del android: drawSelectorOnTop fa spostare il selettore di fronte alla voce selezionata, ma questo naturalmente oscura l'elemento stesso in modo tale che vedo solo il selettore in sé (che nel mio caso è una forma di colore).

Ecco cosa la lista sembra con sfondi impostare:

normal, unselected list with background set

A causa del fondo set, non v'è alcun cambiamento di aspetto quando si selezionano gli elementi. Se cambio l'androide: direttiva drawSelectorOnTop alla vera e selezionare un elemento, ottengo:

selected, with drawSelectorOnTop set to true

E, infine, se ho impostato un'immagine senza sfondo per le voci di elenco, il selettore funziona come previsto, ma naturalmente , non ci sono immagini di sfondo come l'ultima regola del StateSelector non sembra essere seguito (non dovrebbe agire come un ripostiglio?) per gli oggetti non selezionati che significa non bello personalizzato forme arrotondate:

selected, no background

Quindi, il mio problema rimane; se non si imposta uno sfondo per ogni elemento della lista, posso vedere il selettore funzionante, MA gli articoli non hanno lo sfondo quando non è selezionato. Se imposto uno sfondo per l'elemento, sono fantastici quando non sono selezionati, ma lo sfondo oscura il selettore. Semplicemente non è possibile avere un elemento di elenco dalla forma unica con selettori funzionanti?

Grazie per chiunque altro che può pesare in.

risposta

9

capito questo, il problema era che mentre stavo impostando la listSelector per il ListView a elenco Stato correttamente tramite android:listSelector="@drawable/list_selector", ho anche bisogno di impostare lo sfondo per la voce di elenco a un altro elenco Stato tramite android:background="@drawable/list_background"

Nella lista_background.xml lista di stato, ho:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
android:visible="true"> 

    <!-- the list items are disabled --> 
<item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled, in focus but not being touched/pressed (idle) --> 
    <item 
     android:state_window_focused="true" 
     android:state_pressed="false" 
     android:state_focused="false" 
     android:state_selected="false" 
     android:drawable="@drawable/shape_row" /> 

    <!-- the catch-all --> 
    <item 
     android:drawable="@android:color/transparent" /> 
</selector> 

trovato la risposta qui:

Changing background color of ListView items on Android

In concomitanza con la mia selettore di lista di cui sopra, funziona perfettamente.

+0

Sfortunatamente, sto ancora riscontrando problemi nella personalizzazione della visualizzazione elenco. Ho postato i miei problemi specifici qui: http://stackoverflow.com/questions/5426385/listview-with-nine-patch-item-background-issues; Gradirei qualsiasi input tu possa avere. – LostNomad311

+1

Inoltre, imposta l'attributo list "cacheColorHint" al tuo colore bg. In caso contrario, un rapido scorrimento sull'elenco potrebbe generare un elenco di elementi neri. – larham1

2

Il listSelector viene utilizzato solo per specificare un View che verrà utilizzata nello stesso luogo come il selezionato voce View. Ad esempio, esiste una sola istanza di listSelector per ListView. È possibile specificare se può disegnare sopra o non utilizzare drawSelectorOnTop.

Se si desidera che tutti i tuoi View s utilizzino un elenco di stati, è necessario specificare il punto in cui sono definiti i valori del bambino View s.

Sto usando la fonte per AbsListView come riferimento. Specificamente AbsListView#setSelector(Drawable), AbsListView#positionSelector, AbsListView#drawSelector e AbsListView#dispatchDraw

AbsListView#drawSelector:

private void drawSelector(Canvas canvas) { 
     if (shouldShowSelector() && mSelectorRect != null && !mSelectorRect.isEmpty()) { 
      final Drawable selector = mSelector; 
      selector.setBounds(mSelectorRect); 
      selector.draw(canvas); 
     } 
} 

AbsListView#positionSelector:

void positionSelector(View sel) { 
    final Rect selectorRect = mSelectorRect; 
    selectorRect.set(sel.getLeft(), sel.getTop(), sel.getRight(), sel.getBottom()); 
    positionSelector(selectorRect.left, selectorRect.top, selectorRect.right, 
      selectorRect.bottom); 

    final boolean isChildViewEnabled = mIsChildViewEnabled; 
    if (sel.isEnabled() != isChildViewEnabled) { 
     mIsChildViewEnabled = !isChildViewEnabled; 
     refreshDrawableState(); 
    } 
} 

La fonte indica che v'è un solo mSelector creato/usato e che è posizionato nella lo stesso limite di riferimento come articolo selezionato.

+0

Grazie per il duro lavoro! Quando si menziona listSelector essere utilizzato una sola volta per ListView, questo è ciò che sto facendo specificandolo nel XML ListView. L'impostazione di ogni singolo elemento dell'elenco (sono TextView) per avere uno sfondo significa che listSelector viene nascosto ... nessuno sfondo indica uno sfondo trasparente per ogni TextView fino a quando non viene premuto il selettore. Ho provato a usare la direttiva drawSelectorOnTop per il ListView, e ho lavorato sul fatto che posso vedere il selettore sullo sfondo, ma è anche sopra il primo piano, oscurando anche il contenuto del TextView. –

+0

Forse non è possibile avere un oggetto ListView personalizzato (nel mio caso, arrotondato) E un comportamento corretto del selettore ... forse ho bisogno di specificare uno sfondo per l'intero ListView, diciamo un colore, e quindi i selettori verranno visualizzati correttamente . Speravo di avere arrotondato gli oggetti di ListView e l'interazione del selettore, ma forse non è possibile. –

0

È possibile assegnare lo sfondo predefinito per il layout di root e selector_background per child, in questo caso se l'elemento non è selezionato, lo sfondo predefinito non oscura il selettore. Il suo lavoro per me.

Problemi correlati