2014-07-08 7 views
5

Desidero un frammento con 2 ListView. Non voglio che la lista scorri, invece voglio solo scorrere l'intero frammento. Heres il codice:Come rendere scorrevole un frammento con ListView

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" > 

    <TextView 
     android:id="@+id/day" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:gravity="center_horizontal" 
     android:paddingTop="15dp" 
     android:text="Monday" 
     android:textColor="#000" 
     android:textSize="55sp" /> 

    <TextView 
     android:id="@+id/date" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/day" 
     android:gravity="center_horizontal" 
     android:text="27 April, 2014" 
     android:textColor="#000" 
     android:textSize="45sp" /> 

    <ListView 
     android:id="@+id/home_list_time" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/date" 
     android:layout_margin="10dp" 
     android:background="@color/list_home_time_bg" 
     android:divider="@android:color/white" 
     android:dividerHeight="20.0sp" /> 

    <ListView 
     android:id="@+id/home_list_stime" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/home_list_time" 
     android:layout_margin="10dp" 
     android:background="@color/list_home_stime_bg" 
     android:divider="@android:color/white" 
     android:dividerHeight="20.0sp" /> 

    </RelativeLayout> 

Quando ho eseguito questo codice 2 ° listView ottiene la propria barra di scorrimento, c'è un modo per fermare questo e rendere l'intero frammento per scorrere?

+0

Penso che sia una cattiva idea ma hai provato a racchiudere il RelativeLayout in una ScrollView? Penso che vedrai qualche strano comportamento di scorrimento e/o l'altezza del listview potrebbe non essere quello che ti aspetti. Questo perché la scrollview è piuttosto aggressiva quando si misura una listview non popolata. – Delblanco

risposta

10

Per interrompere l'uso listview scrolling -

listView.setScrollContainer(false); 

Per scorrere frammento messo dentro ScrollView -

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
     <!-- everything you already have --> 
</ScrollView> 

Per ulteriori check - how-to-get-a-non-scrollable-listview.

NOTA:

Se mettete ListView all'interno di uno ScrollView poi tutto il ListView non allunga per tutta la sua altezza. Di seguito è riportato un metodo per risolvere questo problema.

/**** Method for Setting the Height of the ListView dynamically. 
**** Hack to fix the issue of not showing all the items of the ListView 
**** when placed inside a ScrollView ****/ 
public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) 
     return; 

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED); 
    int totalHeight = 0; 
    View view = null; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, listView); 
     if (i == 0) 
      view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT)); 

     view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += view.getMeasuredHeight(); 
    } 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

Per utilizzare questo metodo solo passare il ListView all'interno di questo metodo:

ListView list1 = (ListView) view.findViewById(R.id.home_list_time); 
setListViewHeightBasedOnChildren(list1); 

ListView list2 = (ListView) view.findViewById(R.id.home_list_stime); 
setListViewHeightBasedOnChildren(list2); 

Maggiori informazioni qui - android-list-view-inside-a-scroll-view.

+0

Per qualche ragione, ora listView mostra solo il primo elemento e dobbiamo scorrere per vedere il resto e l'intera attività del frammento non riempie l'altezza dello schermo del cellulare. La tua risposta avrebbe dovuto funzionare, ma non so cosa c'è di sbagliato ... Perché il listView continua a scorrere se lo impostiamo su false? – user2132383