2012-08-31 20 views
27

Chcę wyświetlić ekran profilu dla moich użytkowników.Wyłącz przewijanie listView zawartego w ScrollView

Musi mieć trzy widoki (2 Buttons i ImageView) oraz ListView, aby wyświetlić zawartość utworzoną przez tego użytkownika.

Jednak nie chcę, aby przewinąć ListView. Zamiast tego chcę, aby był tak duży, jak jest to potrzebne, i umieścić wszystkie moje widoki wewnątrz ScrollView, tak aby trzy pierwsze widoki były wyświetlane wraz z ListView. To oczywiście nie działa zgodnie z przeznaczeniem.

Wszystkie moje trzy przedmioty znajdują się wewnątrz LinearLayout. Pomyślałem o uczynieniu ich pierwszym elementem w ListView, ale to prowadzi do tego, że można je wybrać jako pierwszy element, i muszą wykonać niepotrzebne kodowanie.

Czy jest jakiś sposób na zrobienie tego w łatwy sposób, czy też będę musiał trzymać się Układu jako pierwszego elementu w moim ListView?

+0

czek to: http://stackoverflow.com/questions/4338185/how-to- get-a-non-scrollable-listview –

+0

Tak, ale jeśli użyję LinearLayout zamiast ListView, nie otrzymam zdarzenia OnItemSelected, co prowadzi do bardziej niepotrzebnego kodowania. – razielsarafan

+0

Witam link i przeczytaj go uważnie. użyj listview w LinearLayout. ustaw ScrollContainer false i możesz powiązać OnClickListener lub OnTouchListener z widokiem, który uruchomi się po kliknięciu lub dotknięciu –

Odpowiedz

6

Dodanie ich do ListView jako pierwsza pozycja wydaje się to całkiem dobre rozwiązanie.

Aby zmienić widok, wybierz Widok i .setClickable(false).

11

Można to zrobić przez

listView.setScrollContainer(false); 

dłużej sprawdź

How to get a non scrollable ListView?

+6

To nie działa, a podany link jest sprzeczny z twoją odpowiedzią. –

+1

@MattW Podałem tę referencyjną przyczynę tej odpowiedzi "Nie umieszczaj listview w przewijanym widoku, to nie działa.Jeśli chcesz listę elementów, które nie są przewijane, nazywa się to Linelayout". powyższy kod nie zadziała, faktycznie widok listy ma problem z układem przewijania. –

+0

@SaifuddinSarker, ale co się stanie, jeśli będę mieć dynamiczną liczbę elementów, które chcę pokazać na liście, których nie można przewijać? – Micer

5

Dodałbym View z niewidocznym tłem na wierzchu ListView. Ustaw dla niego View.OnTouchListener(). I skonsumuj wydarzenie, zwracając true w metodzie onTouch() z View.OnTouchListener().

Gdy chcesz lista zostać ponownie przewijanie do tyłu, usuń dotykowy słuchacza ustawiony na przezroczystej View

2

jeśli trzeba pokazać ograniczoną liczbę elementów w widoku listy i chcesz zatrzymać widoku listy z przewijania wtedy musi zachować wysokość widoku listy większą niż całkowita wysokość elementów.

na przykład, że chcesz pokazać 3 przedmioty. (wysokość rzędu to 30). wówczas całkowita wysokość pozycji wynosi 3 x 30dp = 90dp,

, więc musisz ustawić wysokość listy większą niż 90. np .: 100dp. więc teraz twój listview nie będzie przewijany w żadnym wypadku.

39

Znalazłem bardzo proste rozwiązanie. Po prostu pobierz adapter widoku listy i obliczyć jego rozmiar po wyświetleniu wszystkich elementów. Zaletą jest to, że to rozwiązanie działa również w ScrollView.

Przykład:

public static void justifyListViewHeightBasedOnChildren (ListView listView) { 

    ListAdapter adapter = listView.getAdapter(); 

    if (adapter == null) { 
     return; 
    } 
    ViewGroup vg = listView; 
    int totalHeight = 0; 
    for (int i = 0; i < adapter.getCount(); i++) { 
     View listItem = adapter.getView(i, null, vg); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams par = listView.getLayoutParams(); 
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1)); 
    listView.setLayoutParams(par); 
    listView.requestLayout(); 
} 

wywołać tę funkcję przechodzenia nad obiektu ListView:

justifyListViewHeightBasedOnChildren(myListview); 

Funkcja pokazane powyżej jest modidication urzędu w: Disable scrolling in listview

Należy pamiętać, aby wywołaj tę funkcję po ustawieniu adaptera na widok listy. Jeśli zmienił się rozmiar wpisów w adapterze, musisz również wywołać tę funkcję.

+1

Podana metoda działa, ale po wykonaniu tego mój zwój jest najbardziej widoczny. Cała strona zostanie przewinięta w dół. Jakieś rozwiązanie? –

+0

Dzięki za wspaniałą odpowiedź. Rozwiązałem mój problem. –

-1

W pliku xml wystarczy umieścić

<listview android:nestedScrolling="false"/> 

To działa dla mnie ...

+0

Znalazłem 'android: nestedScrollingEnabled =" false "', ale problem w moim przypadku to "Atrybut nestedScrollingEnabled jest używany tylko na poziomie API 21 i wyższym". – Micer

Powiązane problemy