2013-05-02 11 views
6

So che tutti raccomandano di non usare mai ListView e ScrollView insieme e sono completamente d'accordo. Tuttavia, attualmente sono bloccato con un modello molto semplice come la pagina del profilo di 8tracks (come mostrato nell'immagine sotto), che include un'area per il profilo utente e un elenco di mix che hanno fatto. Quindi, fondamentalmente, è auspicabile che gli utenti possono semplicemente scorrere verso il basso la pagina, il che significa che la parte profilo otterrà sulla parte superiore dello schermo e gradualmente fuori dalla vista, e allo stesso tempo la lista qui sotto viene fatto scorrere troppo:Android - Crea un LinearLayout che contiene una ListView scorrevole

enter image description here

Tuttavia, al momento, tutto ciò che posso fare è includere un ListView all'interno di un LinearLayout, proprio come il mio schizzo qui.

enter image description here

Con questo progetto, posso scorrere solo l'elenco verso il basso, mentre la zona del profilo rimane nello stesso posto, che fa schifo. Quindi sto cercando qualsiasi idea per rendere scorrevole tutta la pagina, non solo la lista. Per favore aiuto e grazie.

MODIFICATO: Mi dispiace per la domanda fuorviante. Il mio problema è ancora più complicato perché il contenuto delle schede non è solo ListView - alcune schede contengono LinearLayout o GridView. Ancora una volta, ciò che voglio ottenere è rendere scorrevole tutta la pagina, ma ScrollView non può essere d'aiuto perché se il contenuto di una scheda è un ListView o GridView, queste viste verranno compresse e, cosa più importante, questo va contro la regola di progettazione.

risposta

1

So che è tardi, ma sono lo sviluppatore corrente per 8 tracce. L'app (vecchia) 2.x che hai mostrato sopra viene riscritta, ma posso mostrarti cosa ha fatto il vecchio dev per la pagina del profilo.

Prima di iniziare devo dire che questo non è il modo migliore per farlo, ma l'app 8tracks (2.x) è vecchia.

Torna al codice ... ProfileActivity contiene ProfileFragment.

Il layout principale che si vede con il tasto Follow (e l'immagine del profilo) è questo:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <!-- Image, name, location --> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:padding="10dip" > 

     <com.gdub.widget.ImageViewClickable 
      android:id="@+id/dj_avatar" 
      android:layout_width="110dip" 
      android:layout_height="110dip" 
      android:layout_marginRight="10dip" 
      android:background="@drawable/default_avatar_max200" 
      android:scaleType="centerCrop" /> 

     <com.gdub.widget.CollapsingTextView 
      android:id="@+id/dj_location" 
      style="@style/mix.counts" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dip" 
      android:layout_toRightOf="@id/dj_avatar" /> 

     <ViewSwitcher 
      android:id="@+id/profile_action_btn" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/dj_location" 
      android:layout_toRightOf="@id/dj_avatar" > 

      <Button 
       android:id="@+id/follow_btn" 
       style="@style/white_button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/follow" /> 

      <Button 
       android:id="@+id/edit_profile_btn" 
       style="@style/white_button" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@string/edit_profile" /> 
     </ViewSwitcher> 
    </RelativeLayout> 

    <TextView 
     android:id="@+id/dj_bio" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="-25dip" 
     android:gravity="left|center_vertical" 
     android:lineSpacingExtra="2dip" 
     android:paddingLeft="10dip" 
     android:paddingRight="10dip" 
     android:textColor="@color/default_text" 
     android:textSize="15sp" /> 

    <include 
     android:id="@+id/profile_tabs" 
     layout="@layout/profile_tabs" /> 

</LinearLayout> 

E profile_tabs ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:visibility="gone" 
    android:orientation="horizontal"> 

    <include 
     android:id="@+id/profile_mixes_button" 
     layout="@layout/profile_tab" /> 

    <include 
     android:id="@+id/profile_followers_button" 
     layout="@layout/profile_tab" /> 

    <include 
     android:id="@+id/profile_following_button" 
     layout="@layout/profile_tab" /> 

</LinearLayout> 

Quindi, come potete vedere si tratta di un impianto regolare con tre pulsanti "simulando" le schede.

I contenuti delle linguette è dettata anche da un ViewSwitcher:

<?xml version="1.0" encoding="utf-8"?> 
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/profile_view_switcher" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:inAnimation="@anim/fade_in_300" 
       android:outAnimation="@anim/fade_out_300" 
       android:background="@color/white"> 

<include 
    android:id="@+id/profile_loading" 
    layout="@layout/loading_view_full" /> 

<ListView 
    android:id="@+id/profile_content_list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:cacheColorHint="#00000000" 
    android:divider="@null" 
    android:dividerHeight="0dip" 
    android:fadingEdge="none" /> 

</ViewSwitcher> 

Ciò dimostra una ruota di carico e quindi passa al listview. Non ci sono altri ViewGroup scorrevoli.

E questo è fondamentalmente.

Ora, se si desidera eseguire lo scroll completo di TUTTO, è necessario utilizzare un adattatore personalizzato e impostare il layout di cui sopra come intestazione (o almeno usare getItemType nell'adattatore in modo intelligente). In questo modo l'intero schermo è una lista (con tutte le ottimizzazioni di una lista).

Noi (ab) usiamo questo nella nuova app 8tracks sotto dev. ;)

+1

È fantastico avere una risposta dall'autore! Questo è così intelligente e lo apprezzo davvero. Anche se ho finito il mio progetto (rinunciando a usare la parte di intestazione), sono sicuro che questo sarà utile per me in futuro (e anche per gli altri!). Grazie molte. –

+0

Prego! :) –

1

Prova a utilizzare quanto segue sulla tua listview.

listview.addHeaderView(v); 

rememeber Inoltre, è necessario chiamare questo metodo prima di chiamare setAdapter() sul tuo ListView.

include la linearlayout in cui sono presenti i dettagli dell'utente e le schede e la aggiungono come intestazione all'elenco.

+0

È un peccato che non l'ho mai saputo, quindi grazie per avermi illuminato. Purtroppo, questo non soddisfa le mie esigenze perché in realtà solo una delle mie schede contiene un ListView e altre contengono GridView e LinearView, quindi devo aggiungere ognuna di esse come un frammento alle schede invece di aggiungere le schede come intestazione del Visualizzazione elenco. –

0

È possibile provare a rendere il profilo e le schede l'intestazione del listview, quindi aggiornare il contenuto della listview quando si premono le schede. Non so se vuoi che le schede scompaiano dalla vista mentre scorri, comunque.

+0

Questo è un po 'di confusione per me, perché non tutte le mie schede contengono un listview. Cosa devo fare se, per esempio, la prima scheda ha un 'LinearLayout' e solo gli altri due hanno' ListView'? –

0

In base alle linee guida e alle best practice per l'interfaccia utente, è consigliabile non utilizzare il contenuto scorrevole all'interno di ScrollView e ciò impedisce lo scorrimento del contenuto scorrevole.

Quando si inseriscono due scrollview android è sufficiente confondere quale visualizzazione di scorrimento viene toccata. Quindi a volte non riesce a fornire un evento di tocco.

Tuttavia, se si desidera ottenere la funzionalità di scorrimento, è possibile gestirla utilizzando l'evento onTouch della vista specifica. E hai bisogno di progettare il tuo layout di conseguenza.

Ma anche se il requisito ti obbliga a realizzare tali layout. Prova questo ...

Dire che il caso è un po 'come questo ....

<ScrollView android:id=”@+id/parent_scroll” 
     android:layout_width=”fill_parent” 
     android:layout_height=”wrap_content” 
     android:layout_weight=”1″ 
     android:background=”@drawable/dotted_bg” 
     android:focusableInTouchMode=”false”> 
        <LinearLayout /> 
        <LinearLayout /> 
        <LinearLayout > 
        <ScrollView android:id=”@+id/child_scroll” 
        android:layout_width=”fill_parent” 
        android:layout_height=”fill_parent” 
        android:background=”@drawable/text_box_bg”> 
       <TextView android:id=”@+id/text_description” 
        android:layout_width=”fill_parent” 
        android:layout_height=”fill_parent” 
        android:textColor=”@color/gray” 
        android:textSize=”12dip” 
        android:padding=”5dip” 
        android:scrollbars=”vertical”/> 
       <!–ScrollView> 
       </LinearLayout> 

Fase 1: fornire l'ID unico sia per lo ScrollView.

Passaggio 2: ottenere il riferimento di due scrollview nella propria attività.

parentScroll=(ScrollView)findViewById(R.id.parent_scroll); 
    childScroll=(ScrollView)findViewById(R.id.child_scroll); 

Fase 3: Ora impostate ascoltatori touch per entrambi.

parentScroll.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.v(TAG,”PARENT TOUCH”); 
    findViewById(R.id.child_scroll).getParent().requestDisallowInterceptTouchEvent(false); 
       return false; 
      } 
     }); 
     childScroll.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       Log.v(TAG,”CHILD TOUCH”); 
            // Disallow the touch request for parent scroll on touch of child view 
       v.getParent().requestDisallowInterceptTouchEvent(true); 
       return false; 
      } 
     }); 

spero che vi aiuterà.

+0

Grazie per la risposta dettagliata, ma penso che tu abbia frainteso la mia domanda (forse è colpa mia perché il titolo sembra fuorviante). Quello che voglio ottenere è di poter scorrere l'intera pagina, non solo parte della pagina, quindi disabilitare lo scroll genitore per far scorrere il bambino è come aggiungere un listview all'interno di una linearlayoutout, che non è desiderabile per me. –

+0

Cosa vuoi esattamente raggiungere? Vuoi che il tuo ListView e l'intero layout siano scorrevoli? – GrIsHu

+0

Ho appena modificato la mia domanda e anche il titolo, quindi per favore controlla. Inoltre, se hai qualche suggerimento per un design migliore, sarò ancora più apprezzato. –

Problemi correlati