Mam problem z przewijaniem ListView
wewnątrz pliku ScrollView
. Mam działanie, które ma kilka EditTexts w górnej części, a następnie hosta z dwiema kartami, z których każda ma jeden ListView. Gdy fokusuje widoki EditText, pojawia się klawiatura programowa, a gdy mam ScrollView, zawartość można przewijać. Ale problem pojawia się, gdy w ListViews jest więcej elementów (te na kartach), nie jestem w stanie przewijać ListView, nawet jeśli jest więcej elementów.
Poniżej przedstawiono układ XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?backgroundImage"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:layout_margin="10dip"
android:id="@+id/buttons">
<Button
android:text="Save"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnSaveorUpdate"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
<Button
android:text="Cancel"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnCancelorDelete"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
</LinearLayout>
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:layout_margin="10dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip">
<TextView
android:text="Bill details"
android:textColor="?textColorDark"
android:layout_alignParentTop="true"
android:id="@+id/txtEnterDetails"
android:textSize="25dip"
android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginBottom="2dip"></TextView>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dip"
android:layout_height="0dip" />
<EditText
android:layout_width="fill_parent"
android:hint="Enter data"
android:inputType="numberDecimal"
android:id="@+id/txtSample"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtDescription"
android:hint="Enter description"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtComment"
android:hint="Enter comment (if any)"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtDate"
android:layout_width="wrap_content"
android:text=""
android:textSize="20dip"
android:textColor="?textColorDark"
android:layout_marginLeft="10dip"
android:layout_height="@dimen/editTextHeight"
android:layout_gravity="center_vertical" />
<Button
android:id="@+id/btnPickDate"
android:layout_width="wrap_content"
android:layout_height="@dimen/editTextHeight"
android:text="Select date"
android:layout_margin="2dip"
android:textSize="15dip"
android:layout_gravity="center_vertical" />
</LinearLayout>
<TabHost
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/tabs"></TabWidget>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabcontent">
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:id="@+id/tab1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow1"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Add friend"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtData1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="Data"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtData2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sample"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/tab2"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow2"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Sample"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtUser1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="User"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtUserData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UserData"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView02"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
</ScrollView>
</RelativeLayout>
Czy ktoś może mi powiedzieć, na czym polega problem? Mam inny post dotyczący problemu ListView inside ScrollView, ale nie były one przydatne w moim przypadku.
android
listview
android-layout
scrollview
Ashwani K.
źródło
źródło
Odpowiedzi:
Nie powinieneś umieszczać a
ListView
wewnątrz a,ScrollView
ponieważListView
klasa implementuje własne przewijanie i po prostu nie otrzymuje gestów, ponieważ wszystkie są obsługiwane przez rodzicaScrollView
. Zdecydowanie polecam jakoś uprościć układ. Na przykład możesz dodać widoki, które chcesz przewijać doListView
nagłówków lub stopek.AKTUALIZACJA :
Począwszy od API na poziomie 21 (Lollipop), zagnieżdżone kontenery przewijania są oficjalnie obsługiwane przez Android SDK. Nie jesteśmy bandą metod
View
iViewGroup
klas, które zapewniają tę funkcjonalność. Aby zagnieżdżone przewijanie działało na Lollipopie, musisz włączyć go dla podrzędnego widoku przewijania, dodającandroid:nestedScrollingEnabled="true"
do jego deklaracji XML lub jawnie wywołującsetNestedScrollingEnabled(true)
.Jeśli chcesz, aby zagnieżdżone przewijanie działało na urządzeniach sprzed wersji Lollipop, co prawdopodobnie robisz, musisz użyć odpowiednich klas narzędzi z biblioteki Support. Najpierw trzeba zastąpić cię
ScrollView
z NestedScrollView . Ten ostatni implementuje zarówno NestedScrollingParent, jak i NestedScrollingChild, dzięki czemu może być używany jako kontener nadrzędny lub podrzędny.Ale
ListView
nie obsługuje zagnieżdżonego przewijania, dlatego musisz go podklasować i zaimplementowaćNestedScrollingChild
. Na szczęście biblioteka Support udostępnia klasę NestedScrollingChildHelper , więc wystarczy utworzyć wystąpienie tej klasy i wywołać jej metody z odpowiednich metod klasy widoku.źródło
ListView
byłoby dziwne. Ale twój układ jest bardzo, bardzo skomplikowany. Nie mogę nawet zrozumieć, jak chcesz, żeby wyglądało. W każdym razie lepiej to uprość, ponieważ elementListView
zagnieżdżony w a,ScrollView
który jest zagnieżdżony w innym,ScrollView
wygląda dziwnie i nie zadziała.Znalazłem rozwiązanie, które działa doskonale i
ListView
bez problemu przewija :To, co to robi, to wyłączanie
TouchEvent
znakówScrollView
iListView
przechwytywanie ich. Jest proste i działa cały czas.źródło
Mam też jedno rozwiązanie. Zawsze używam tej metody. Spróbuj tego
Klasa NestedListView.java:
źródło
LinearLayout
a niż aListView
. Oznacza to, że jeśli masz dużą liczbę elementów listy (lub złożonych elementów listy) wtedy urządzenia zTrzeba po prostu zastąpić
<ScrollView ></ScrollView>
z tymCustom ScrollView
Like<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
źródło
Miałem ten sam problem i podczas wyszukiwania w Google znalazłem Twoje pytanie. Tak zaznaczona odpowiedź zadziałała również dla mnie, ale był jakiś problem.
Tak czy inaczej znalazłem inne rozwiązanie . który działa doskonale bez wykonywania żadnej żonglerki.
źródło
źródło
Oto dokładna metoda korzystania z widoku listy w widoku przewijania. Wszystko, co mamy do obsługi zdarzeń dotykowych.
źródło
Użyj poniższej metody i ciesz się!
listViewTouchAction to globalna wartość całkowita. Jeśli możesz wymienić linię
z czymś innym, podziel się tym z nami.
Cieszyć się!
źródło
Posiadanie dwóch różnych przewijanych widoków razem to zła praktyka. Sam ListView ma własną funkcję przewijania, a wysokość jest automatycznie dostosowywana zgodnie z ustawieniami adaptera dla elementów wiersza (mając na uwadze Keelping, nie ustawiamy określonej wysokości na ListView w naszym Layout xml). Jednak w twoim przypadku możesz zamienić ListView na klasę, co dostosuje wysokość Twojego ListView, pamiętając, że Twój ListView znajduje się w ScrollView.
Pomoże Ci to:
Teraz rozszerz swój ListView o tę klasę, po prostu zmień swój znacznik ListView z zasobu xml na łagodny w ten sposób,
To rozwiąże problem przewijania w ListView, ponieważ teraz przewijaniem nadrzędnym zarządza ScrollView, a nie ListView.
źródło
Wiem, że to pytanie zostało zadane dawno temu, ale kto kiedykolwiek utknął, może to rozwiązać, dodając tę linię do swojego ListView
Na przykład -
źródło
Mam podobny problem i rozwiązałem go, tworząc klasę niestandardową, rozszerzając ją za pomocą ListView.
ScrollableListView.java
Stosowanie:
źródło
Demo_ListView_In_ScrollView
==============================
========================
listview_adapter
==========================
===================================
Klasa pomocnicza
====================================
========================
demo_listview_in_scrollview_activity.xml
========================
================
item_list_xml.xml
==================
źródło
Najlepszym rozwiązaniem jest użycie NestedScrollVew z RecyclerView lub jeśli chcesz przejść z Listview, możesz dodać do tego widok nagłówka i stopki. Na przykład:
źródło
Wypróbowałem i przetestowałem prawie wszystkie wymienione powyżej metody, zaufaj mi, po całkowitym ucieczce od RecyclerView, zastąpiłem ListView RecyclerView i działało idealnie. Nie potrzebowałem żadnej biblioteki innej firmy dla ExtendedHeightListView i wszystkiego, po prostu zwykły i prosty RecyclerView.
Więc oto mój plik układu przed recyclinglerView:
TO JEST PO ZMIANIE MOJEJ LISTY NA JEDNE Z WIELU ROZWIĄZAŃ WYMIENIONYCH POWYŻEJ. Problem polegał na tym, że listview nie zachowywał się poprawnie z powodu błędu 2 scrollview (może nie błąd) w Androidzie.
Zastąpiłem widokiem recyklera, aby utworzyć ostateczny układ.
To jest mój adapter widoku recyklera:
A to jest mój niestandardowy układ RecyclerView:
VOILA, uzyskałem pożądany efekt ListView (teraz RecyclerView) w scollview. Oto ostateczny obraz interfejsu użytkownika
Na koniec uważam, że zastąpienie RecyclerView było dla mnie lepszym wyborem, ponieważ poprawiło ogólną stabilność aplikacji, a także pomogło mi lepiej zrozumieć RecyclerView. Gdybym miał zasugerować rozwiązanie, powiedziałbym, że zamień ListView na RecyclerView.
źródło
Powyższe rozwiązanie podane przez @Shailesh Rohit działa doskonale. Trzeba zrobić kilka sztuczek.
Jeśli umieszczasz klasę pomocniczą w tej samej klasie (głównej), ustaw klasę pomocniczą jako statyczną, a metoda getListViewSize () nie będzie statyczna.
Najważniejsze, napisz "Helper.getListViewSize (listView);" instrukcja po ustawieniu adaptera po raz pierwszy, np. "listView.setAdapter (myAdapter);" jak również wtedy, gdy używasz "myAdapter.notifyDataSetChanged ();"
Użycie pokazano poniżej.
listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);
myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);
źródło
Według mnie, gdy używasz setOnTouchListener dla rodzica lub dziecka, zatrzymaj przewijanie rodzica, gdy dotykasz dziecka, w przeciwnym razie zatrzymaj przewijanie dziecka, gdy dotykasz rodzica
źródło
Spróbuj tego z ScrollView, a nie z ListView.
źródło
requestDisallowInterceptTouchEvent (boolean disallowIntercept)
Wypróbuj tę odpowiedź,
źródło
Zastąp ListView przez RecycleView w ScrollView. działa płynnie bez dodatkowego kodu źródłowego:
źródło
W przypadku ListView wewnątrz ScrollView użyj NestedScrollView, który może bardzo łatwo obsłużyć tę funkcję:
źródło
Wystąpił ten błąd, a moje rozwiązanie wygląda następująco:
1. Utwórz niestandardowy widok listy, którego nie można przewijać
}
2. Użyj powyższej klasy niestandardowej dla pliku xml
Mam nadzieję, że najlepiej dla ciebie.
źródło
Znalazłem na to rozwiązanie, zamiast używać scrollview, możesz użyć addHeaderview i addFooterview z listview
Oto mój fragment,
Teraz widok listy umożliwia przewijanie układu. Ciesz się tym !!!
źródło
Zastąp ScrollView przez android.support.v4.widget.NestedScrollView wewnątrz xml. to biegnie
1) Użyj w XML ::::
android.support.v4.widget.NestedScrollView
zamiast::::
ScrollView
2) I użyj do widoku listy w ten sposób, używając NonScrollListView w pliku cs:
3) Na koniec użyj tego kodu, aby zidentyfikować widok przewijania w pliku cs:
źródło
Najlepszy kod
źródło
Dodaj:
android:nestedScrollingEnabled="true"
źródło
Użyj tej metody, a widok listy będzie przewijalny w widoku przewijania: -
źródło
Nie można dodać ListView w widoku przewijania, ponieważ widok listy również jest przewijany i wystąpiłby problem z synchronizacją między przewijaniem widoku listy i przewijaniem widoku przewijania. Możesz utworzyć widok CustomList i dodać do niego tę metodę.
źródło
Nie podawaj widoku przewijania
ListView
, ponieważ ma to ustawienie domyślneźródło