Ich habe Probleme beim Scrollen ListView
in einem ScrollView
. Ich habe eine Aktivität mit einigen EditTexts im oberen Teil und dann einen Registerkartenhost mit zwei Registerkarten mit jeweils einer ListView. Wenn die EditText-Ansichten fokussiert sind, wird die Softtastatur angezeigt, und da ich eine ScrollView habe, kann der Inhalt gescrollt werden. Das Problem tritt jedoch auf, wenn mehr Elemente in ListViews (solche in Registerkarten) vorhanden sind. Ich kann die ListView nicht scrollen, selbst wenn mehr Elemente vorhanden sind.
Das folgende ist das Layout-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>
Kann mir bitte jemand sagen, wo das Problem liegt? Ich habe einen weiteren Beitrag zum ListView in ScrollView-Problem, aber sie waren in meinem Fall nicht von Nutzen.
android
listview
android-layout
scrollview
Ashwani K.
quelle
quelle
Antworten:
Sie sollten kein
ListView
Inside a einfügen,ScrollView
da dieListView
Klasse ein eigenes Scrollen implementiert und keine Gesten empfängt, da alle vom übergeordneten Element verwaltet werdenScrollView
. Ich empfehle Ihnen dringend, Ihr Layout irgendwie zu vereinfachen. Sie können beispielsweise Ansichten hinzufügen, zu denen SieListView
als Kopf- oder Fußzeilen scrollen möchten .UPDATE :
Ab API Level 21 (Lollipop) werden verschachtelte Scroll-Container offiziell vom Android SDK unterstützt. Es gibt eine Reihe von Methoden
View
undViewGroup
Klassen, die diese Funktionalität bereitstellen. Damit verschachteltes Scrollen auf dem Lollipop funktioniert, müssen Sie es für eine untergeordnete Bildlaufansicht aktivieren, indem Sie esandroid:nestedScrollingEnabled="true"
zu seiner XML-Deklaration hinzufügen oder explizit aufrufensetNestedScrollingEnabled(true)
.Wenn Sie verschachteltes Scrollen auf Geräten vor Lollipop ausführen möchten, was Sie wahrscheinlich tun, müssen Sie entsprechende Dienstprogrammklassen aus der Support-Bibliothek verwenden. Zuerst musst du dich ersetzen
ScrollView
durch NestedScrollView ersetzt werden . Letzteres implementiert sowohl NestedScrollingParent als auch NestedScrollingChild, sodass es als übergeordneter oder untergeordneter Bildlaufcontainer verwendet werden kann.Aber
ListView
nicht verschachtelten Bildlauf unterstützt, deshalb müssen Sie es zu Unterklasse und zu implementierenNestedScrollingChild
. Glücklicherweise bietet die Support-Bibliothek NestedScrollingChildHelper- Klasse, sodass Sie nur eine Instanz dieser Klasse erstellen und ihre Methoden aus den entsprechenden Methoden Ihrer View-Klasse aufrufen müssen.quelle
ListView
zu stecken wäre seltsam. Ihr Layout ist jedoch sehr, sehr kompliziert. Ich kann nicht einmal verstehen, wie es aussehen soll. Auf jeden Fall sollten Sie es einfacher machen, weil einListView
in einScrollView
anderes verschachteltes, das in ein anderes verschachtelt ist,ScrollView
seltsam aussieht und nicht funktioniert.Ich habe eine Lösung gefunden, die hervorragend funktioniert und
ListView
problemlos scrollen kann :Dies deaktiviert das
TouchEvent
s auf demScrollView
und lässt esListView
abfangen. Es ist einfach und funktioniert die ganze Zeit.quelle
Ich habe auch eine Lösung. Ich benutze immer diese Methode. Versuche dies
NestedListView.java-Klasse:
quelle
LinearLayout
als wie aListView
. Dies bedeutet, dass Sie eine große Anzahl von Listenelementen (oder komplexen Listenelementen) haben. dann werden die Android-Geräte viel ZeitSie müssen nur Ihre
<ScrollView ></ScrollView>
durch dieseCustom ScrollView
wie ersetzen<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
quelle
Ich hatte das gleiche Problem und beim Googeln habe ich Ihre Frage gefunden. Ja, die markierte Antwort hat auch bei mir funktioniert, aber es gab ein Problem.
Jedenfalls habe ich eine andere Lösung gefunden . das funktioniert perfekt ohne jongleur.
quelle
quelle
Hier ist die genaue Methode zur Verwendung von Listview in der Scrollview. Wir müssen nur mit Berührungsereignissen umgehen.
quelle
Verwenden Sie die folgende Methode und genießen Sie!
listViewTouchAction ist ein globaler ganzzahliger Wert. Wenn Sie die Leitung ersetzen können
mit etwas anderem teilen Sie es uns bitte mit.
Genießen!
quelle
Es ist eine schlechte Praxis, zwei verschiedene Bildlaufansichten zusammen zu haben. ListView selbst verfügt über eine eigene Bildlauffunktion und die Höhe wird automatisch gemäß den Adaptereinstellungen für Ihre Zeilenelemente angepasst (Beachten Sie, dass wir in unserer Layout-XML keine bestimmte Höhe für ListView festlegen). In Ihrem Fall können Sie ListView jedoch durch eine Klasse ersetzen. Dadurch wird die Höhe für Ihre ListView angepasst, wobei zu berücksichtigen ist, dass sich Ihre ListView in ScrollView befindet.
Das wird dir helfen:
Erweitern Sie jetzt Ihre ListView mit dieser Klasse. Ändern Sie einfach Ihr ListView-Tag von Ihrer Ressourcen-XML in "Smothing".
Dies löst Ihr Bildlaufproblem von ListView, da das übergeordnete Bildlauf jetzt von ScrollView und nicht von ListView verwaltet wird.
quelle
Ich weiß, dass diese Frage schon vor langer Zeit gestellt wurde, aber wer jetzt feststeckt, kann dies lösen, indem er diese Zeile in Ihre ListView einfügt
Zum Beispiel -
quelle
Ich habe ein ähnliches Problem und wurde durch Erstellen einer benutzerdefinierten Klasse durch Erweitern mit ListView behoben.
ScrollableListView.java
Verwendung:
quelle
Demo_ListView_In_ScrollView
==============================
========================
listview_adapter
==========================
===================================
Helferklasse
===================================
========================
demo_listview_in_scrollview_activity.xml
========================
================
item_list_xml.xml
==================
quelle
Die beste Lösung besteht darin, NestedScrollVew mit RecyclerView zu verwenden. Wenn Sie mit Listview arbeiten möchten, können Sie diesem eine Kopf- und Fußzeilenansicht hinzufügen. Beispielsweise:
quelle
Ich habe fast alle oben genannten Methoden ausprobiert und getestet. Vertrauen Sie mir, nachdem ich vollständig von RecyclerView weggelaufen bin, habe ich meine ListView durch RecyclerView ersetzt und es hat perfekt funktioniert. Ich brauchte keine Bibliothek von Drittanbietern für ExtendedHeightListView und alles, nur einfache RecyclerView.
Also hier ist meine Layout-Datei vor recyclerView:
Dies geschieht, nachdem ich meine Liste durch eine der vielen oben genannten Lösungen ersetzt habe. Das Problem war also, dass sich die Listenansicht aufgrund eines 2-Scrollview-Fehlers (möglicherweise kein Fehler) in Android nicht richtig verhält.
Ich habe die Ansicht durch die Recycler-Ansicht ersetzt, um mein endgültiges Layout zu erstellen.
Dies ist mein Recycler-Ansichtsadapter:
Und dies ist mein benutzerdefiniertes RecyclerView-Layout:
Und VOILA, ich habe den gewünschten Effekt von ListView (Now RecyclerView) in einer Scollview erhalten. Hier ist das endgültige Bild der Benutzeroberfläche
Abschließend glaube ich, dass das Ersetzen von RecyclerView eine bessere Wahl für mich war, da es die allgemeine Stabilität der App verbesserte und mir auch half, RecyclerView besser zu verstehen. Wenn ich eine Lösung vorschlagen würde, würde ich sagen, ersetzen Sie Ihre ListView durch eine RecyclerView.
quelle
Die obige Lösung von @Shailesh Rohit funktioniert einwandfrei. Einige Tricks müssen gemacht werden.
Wenn Sie die Hilfsklasse in dieselbe Klasse (Hauptklasse) einfügen, machen Sie die Hilfsklasse als statisch und getListViewSize () nicht statisch.
Am wichtigsten ist, schreiben Sie "Helper.getListViewSize (listView);" Anweisung nach dem ersten Setzen des Adapters wie "listView.setAdapter (myAdapter);" sowie wann immer Sie "myAdapter.notifyDataSetChanged ();"
Die Verwendung wird unten gezeigt.
listView = (ListView) findViewById (R.id.listView); myAdapter = neuer ArrayAdapter (this, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);
myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);
quelle
Während Sie setOnTouchListener om parent oder child verwenden, stoppen Sie das Scrollen des Elternteils, wenn Sie das Kind berühren. Andernfalls beenden Sie das Scrollen des Kindes, wenn Sie das Elternteil berühren
quelle
Versuchen Sie dies mit ScrollView, nicht mit ListView.
quelle
requestDisallowInterceptTouchEvent (boolean disallowIntercept)
Versuchen Sie diese Antwort,
quelle
Ersetzen Sie ListView durch RecycleView in ScrollView. es läuft reibungslos ohne zusätzlichen Quellcode:
quelle
Für ListView in ScrollView kann NestedScrollView verwendet werden, um diese Funktionalität sehr einfach zu handhaben:
quelle
Ich habe diesen Fehler gehabt. Und meine Lösung lautet wie folgt:
1. Erstellen Sie eine benutzerdefinierte Listenansicht, die nicht gescrollt werden kann
}}
2. Verwenden Sie die obige benutzerdefinierte Klasse für XML-Dateien
Hoffe am besten für dich.
quelle
Ich habe eine Lösung dafür gefunden, Anstatt die Bildlaufansicht zu verwenden, können Sie addHeaderview und addFooterview von listview verwenden
Hier ist mein Ausschnitt,
Mit der Listenansicht kann jetzt auch Ihr Layout gescrollt werden. Geniesse es!!!
quelle
Ersetzen Sie ScrollView durch android.support.v4.widget.NestedScrollView in XML. es läuft
1) Verwendung in XML ::::
android.support.v4.widget.NestedScrollView
anstatt::::
ScrollView
2) Verwenden Sie NonScrollListView in der cs-Datei für die Listenansicht auf diese Weise:
3) Verwenden Sie schließlich diesen Code, um die Bildlaufansicht in der CS-Datei zu identifizieren:
quelle
Bester Code
quelle
Hinzufügen:
android:nestedScrollingEnabled="true"
quelle
Wenn Sie diese Methode verwenden, wird Ihre Listenansicht in der Bildlaufansicht scrollbar: -
quelle
Sie können einer Bildlaufansicht keine Listenansicht hinzufügen, da die Listenansicht auch einen Bildlauf durchführt und ein Synchronisierungsproblem zwischen dem Bildlauf der Listenansicht und dem Bildlauf der Bildlaufansicht besteht. Sie können eine CustomList-Ansicht erstellen und diese Methode hinzufügen.
quelle
ListView
Geben Sie keine Bildlaufansicht an , da diese Einstellung standardmäßig aktiviert istquelle