2011-09-16 14 views
15

Mi piacerebbe avere la listview in ListActivity da visualizzare con l'intestazione e il piè di pagina sempre visibili anche se i dati dell'elenco sono vuoti.Elenco attività con intestazione, piè di pagina e vuoto tutto visibile

Una lista vuota fa apparire la vista vuota e l'intestazione e il piè di pagina scompaiono. Tuttavia la mia intestazione ha un'interfaccia utente di filtraggio e dovrebbe quindi essere sempre visibile.

L'unico modo in cui posso farlo in questo momento è se tolgo l'intestazione e il piè di pagina dalla listview e li implemento come viste statiche all'esterno nel layout dell'attività. Tuttavia, questi sono sempre visibili e solo i dati scorrono.

Preferirei che entrambi si trovino in cima e in fondo alla lista a scorrimento. L'avvolgimento di tutto in una vista di scorrimento non funziona, da allora ci sono due viste di scorrimento annidate (la vista elenco all'esterno e quella di avvolgimento).

C'è un modo per farlo a parte un trucco come aggiungere un record falso?

+0

È possibile impostare la visibilità del tuo vista vuota come 'GONE' e impostare il' ListView' visibile. Vedi questa risposta: http://stackoverflow.com/questions/4798387/android-how-to-reuse-a-header-layout-as-an-empty-view-in-a-listview/10347758#10347758 –

risposta

16

Fai la tua vista vuoto includi la tua intestazione.

cioè

<ListView /> 
<RelativeLayout 
    android:id="@android:id/empty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
     // Add whatever you want here including your header 
</RelativeLayout> 
+0

In questo modo l'intestazione/il piè di pagina non scorre come parte dell'elenco. Ho già capito quello che ho detto nella domanda e preferirei che l'intestazione e il piè di pagina facciano parte della lista a scorrimento. Avvolgere una vista di scorrimento attorno a entrambi non funziona. –

+1

No, aggiungi l'intestazione con addHeaderView (R.layout.your_header); E aggiungi anche l'intestazione in id/empty. In questo modo scorre quando hai degli oggetti, e viene comunque mostrato quando non lo fai. Utilizzare i tag e per arrestare la duplicazione del codice XML – Blundell

+0

oh .. Ora ottengo il trucco. Questa è un'idea carina. –

3

È possibile utilizzare il mio MergeAdapter per questo. Aggiungi la vista dell'intestazione, aggiungi l'adattatore dati e aggiungi la visualizzazione del piè di pagina. Scorreranno tutti all'unisono e l'intestazione e il piè di pagina continueranno anche se l'adattatore nel mezzo non ha righe.

+0

e il la vista vuota verrà visualizzata al posto della vista elenco? –

+0

@Manfred Moser: questo è trattato nella documentazione di 'MergeAdapter' sulla pagina che ho collegato sopra. Per impostazione predefinita, 'MergeAdapter' con le viste header + footer non mostrerà la vista vuota, anche se l'adattatore è vuoto. Se si desidera modificare tale comportamento, è necessario eseguire l'override di 'isEmpty()' in una sottoclasse. – CommonsWare

+0

Grazie Mark: potrebbe essere un po 'pesante aggiungere tutto questo nel mio caso, ma avrò uno sguardo - forse potrò prendere parte del tuo codice e usare un approccio da esso. –

2

Ok, questa soluzione alternativa è un trucco. Ma, senza dover creare un oggetto falso.

Per un ArrayAdapter è possibile aggiungere una voce di nulla ... cioè

myAdapter.add(null); 

E, nel MyAdapter GetView (..) si fa qualcosa di simile:

myItem = getItem(position); 
if (myItem == null) { 
    return getLayoutInflater().inflate(R.layout.my_empty_row, null); 
} else { 
... 
} 
+0

Dovrò provarlo. –

+1

L'aggiunta di null non è una buona idea. Riempirà i tuoi articoli con cache/vista riciclata precedente. –

1

ho scoperto che intestazione/piè di pagina sarà sempre visibile se non si chiama ListView.setEmptyView.

Invece, mostrare manualmente/nascondere la vista vuoto:

emptyView.setVisibility(list.size() == 0 ? View.VISIBLE : View.GONE); 
14

Questa risposta è un po 'in ritardo, ma si può semplicemente ignorare BaseAdapter.isEmpty() per restituire falso.

public boolean isEmpty() { 
    return false; 
} 
+0

impari qualcosa di nuovo ogni giorno, e oggi mi hai insegnato qualcosa di nuovo –

1

mi capita di incontrare lo stesso problema, se ListView non ha voce, si potrebbe ListView.setAdapter (nuova SomeAdapter (new ArrayList())); e l'intestazione è anche visibile.

+0

Your my hero ... La soluzione più semplice e ha funzionato come un incantesimo –

1

Nel mio caso ho avuto entrambe le visualizzazioni di intestazione e piè di pagina. Ho posizionato il mio mEmptyView nella visualizzazione a piè di pagina.

In primo luogo, come user1034295 mentioned, ho overrided isEmpty() il metodo di adattatore:

@Override 
public boolean isEmpty() { 
// If not overridden, then this will return `true` if your list is empty 
// Thus, you won't see header/footer views 
    return false; 
} 

adattatore ExpandableListView di getGroupCount(). Sostituisci il metodo appropriato per l'adattatore.

@Override 
public int getGroupCount() { 
    int size = null != mData ? mData.size() : 0; 
    if (0 == size) mHostFragment.toggleEmptyView(true); 
    else mHostFragment.toggleEmptyView(false); 
    return size; 
} 

In te attività/frammento

public void toggleEmptyView(boolean show) { 
    if(show && mEmptyView.getVisibility() != View.VISIBLE) 
     mEmptyView.setVisibility(View.VISIBLE); 
    else if (!show && mEmptyView.getVisibility() != View.GONE) 
     mEmptyView.setVisibility(View.GONE); 
} 

mEmptyView è un bambino in vista footer ListView s'. Quindi, quando la tua lista diventa 0, avrai le viste intestazione/piè di pagina rimaste + mEmptyView diventerà visibile.

0

È possibile mettere insieme il listView e il layout vuoto in un FrameLayout e inserire il margine di layout vuoto nella dimensione dell'intestazione, quindi, è possibile modificare la visibilità della vista vuota quando un elemento viene aggiunto a listview .

disposizione sarà più simile a questo:

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="0dp" 
    android:layout_weight="1"> 

    <ListView 
     android:id="@+id/myListView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     tools:listheader="@layout/myHeader"/> 

    <LinearLayout 
     android:layout_marginTop="@dimen/headerHeight" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/white" 
     android:id="@+id/emptyLayout"> 

     //insert your layout here 

    </LinearLayout> 

</FrameLayout> 
Problemi correlati