Il titolo è chiaro. Sto avendo questo layout:Scorrimento annidato ListView su API <21
_________________
|_______________| <- Toolbar
|___|___|___|___| <- Tablayout
| |
| |
| ViewPager |
| |
|_______________|
Sia barra degli strumenti e tablayout sono all'interno di un AppBarLayout
, in modo da poter utilizzare bandiere di scorrimento per nascondere la barra degli strumenti di scorrimento verso l'alto. Il problema è che questo funziona solo con le viste supportate da scorrimento nidificato. La maggior parte delle schede - voglio dire, la maggior parte delle pagine - sono support.v4.NestedScrollView
s, quindi va bene; altri sono (e devono essere) ListView
s.
Da Lollipop, posso semplicemente aggiungere android:nestedScrollingEnabled="true"
alla visualizzazione elenco e la barra degli strumenti si nasconde correttamente sullo scorrimento.
In API < 21, tuttavia, non esiste un attributo di questo tipo e la barra degli strumenti non viene nascosta. Ancora più importante, gli ultimi elementi nell'elenco sono nascosti, a causa di alcuni bug di misurazione in CoordinatorLayout
: listview funziona come se avesse lo spazio attualmente occupato dalla barra degli strumenti.
Solutions:
Passa a
RecyclerView
, che supporta lo scorrimento nidificato: Non posso, perché ho bisogno di utilizzare un adattatore esterno-biblioteca che funziona solo con una vista adattatore e che non posso sostituire (ovvero,ParseQueryAdapter
);Estendere
ListView
e implementare lo scorrimento nidificato: sembra molto complicato;Estendere
ListView
e implementare qualche soluzione, come la misurazione di materiale per evitare il problema dell'ultimo elemento o (e) un comportamento personalizzato per nascondere la barra degli strumenti: sembra anche complicato;Utilizzare un trucco di layout: non trovato nessuno.
Qualsiasi aiuto?
Per esempio, io (disperatamente) provato:
<android.support.v4.widget.NestedScrollView
android:nestedScrollingEnabled="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</android.support.v4.widget.NestedScrollView>
Ma in questo modo il ListView
non viene presentata come match_parent
. Ottengo una piccola visuale con una piccola altezza e il resto della pagina è vuoto.
Non sono nell'ultima versione, ma ricordo che la classe non è stata elencata nelle API pubbliche per molto tempo. Grazie, tuttavia, per il "non puoi" - ho trascorso alcune ore a occuparmi delle interfacce NestedScrolling. – natario
"non c'è modo di ottenere lo scrolling annidato lavorando su ListView". C'è ViewCompat.setNestedScrollingEnabled (ListView, booleano); – Dogcat
@Dogcat - che non fa nulla prima dell'API 21. Ti evita semplicemente di dover controllare il livello dell'API. – ianhanniballake