У меня проблемы с прокруткой ListView
внутри ScrollView
. У меня есть Activity, которая имеет некоторые EditTexts в верхней части, а затем хост вкладок с двумя вкладками, которые имеют по одному ListView каждая. Когда представления EditText сфокусированы, появляется программная клавиатура, и, поскольку у меня есть ScrollView, содержимое прокручивается. Но проблема возникает, когда в ListViews больше элементов (которые находятся на вкладках), я не могу прокрутить ListView, даже если есть больше элементов.
Ниже приведен макет 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>
Пожалуйста, кто-нибудь может сказать мне, в чем здесь проблема? У меня есть еще один пост о ListView внутри проблемы ScrollView, но они были бесполезны в моем случае.
android
listview
android-layout
scrollview
Ашвани К
источник
источник
Ответы:
Вы не должны помещать
ListView
внутрь a,ScrollView
потому чтоListView
класс реализует свою собственную прокрутку, и он просто не получает жесты, потому что они все обрабатываются родителемScrollView
. Я настоятельно рекомендую вам как-то упростить ваш макет. Например, вы можете добавить представления, которые вы хотите прокрутить,ListView
в верхние или нижние колонтитулы.ОБНОВЛЕНИЕ :
Начиная с API уровня 21 (Lollipop), вложенные контейнеры прокрутки официально поддерживаются Android SDK. Существует множество методов
View
иViewGroup
классов, которые предоставляют эту функциональность. Чтобы заставить вложенную прокрутку работать на Lollipop, вы должны включить ее для дочернего представления прокрутки, добавивandroid:nestedScrollingEnabled="true"
его в объявление XML или явным вызовомsetNestedScrollingEnabled(true)
.Если вы хотите, чтобы вложенная прокрутка работала на устройствах, предшествующих Lollipop, что вы, вероятно, делаете, вы должны использовать соответствующие служебные классы из библиотеки поддержки. Во- первых , вы должны заменить вас
ScrollView
с NestedScrollView . Последний реализует как NestedScrollingParent, так и NestedScrollingChild, поэтому его можно использовать как родительский или дочерний контейнер прокрутки.Но
ListView
не поддерживает вложенную прокрутку, поэтому вам нужно создать ее подкласс и реализоватьNestedScrollingChild
. К счастью, библиотека Support предоставляет класс NestedScrollingChildHelper , поэтому вам просто нужно создать экземпляр этого класса и вызвать его методы из соответствующих методов вашего класса представления.источник
ListView
было бы странно. Но ваш макет очень и очень сложный. Я даже не могу понять, как ты хочешь, чтобы это выглядело. В любом случае вам лучше сделать это проще, потому чтоListView
вложенный в один,ScrollView
который вложен в другой,ScrollView
выглядит странно и не будет работать.Я нашел решение, которое отлично работает и может прокрутить
ListView
без проблем:То, что это делает, отключает
TouchEvent
s наScrollView
и делаетListView
их перехват. Это просто и работает все время.источник
У меня также есть одно решение. Я всегда использую этот метод. Попробуй это
Класс NestedListView.java:
источник
LinearLayout
а не на aListView
. Это означает, что если у вас есть большое количество элементов списка (или сложных элементов списка) тогда устройствам Android понадобится много времени, чтобы открыть активность (или дажеВы должны просто заменить свой
<ScrollView ></ScrollView>
на этоCustom ScrollView
как<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
источник
У меня была такая же проблема, и пока я гуглил, я нашел ваш вопрос. Да, помеченный ответ работал и для меня, но была некоторая проблема.
В любом случае я нашел другое решение . который прекрасно работает, не делая никаких жонглирования.
источник
источник
Вот точный метод использования Listview в Scrollview. Все, что мы должны обрабатывать сенсорные события.
источник
Используйте следующий метод и наслаждайтесь!
listViewTouchAction является глобальным целочисленным значением. Если вы можете заменить линию
с чем-то еще, пожалуйста, поделитесь этим с нами.
Наслаждайтесь!
источник
Это плохая практика иметь два разных вида прокрутки вместе. У самого ListView есть своя собственная функция прокрутки, а высота автоматически настраивается в соответствии с настройками адаптера для ваших элементов строки (помните, что мы не устанавливаем конкретную высоту для ListView в нашем XML-формате макета). Однако в вашем случае вы можете заменить ListView классом, и это отрегулирует высоту для вашего ListView, учитывая, что ваш ListView находится внутри ScrollView.
Это поможет вам:
Теперь расширьте свой ListView этим классом, просто измените тэг ListView с вашего ресурса xml на что-то вроде этого,
Это решит вашу проблему с прокруткой ListView, так как теперь родительская прокрутка управляется ScrollView, а не ListView.
источник
Я знаю, что этот вопрос задан давно, но кто когда-либо застрянет, может решить эту проблему, добавив эту строку в свой ListView
Например -
источник
У меня похожая проблема, и она решена путем создания пользовательского класса путем расширения с помощью ListView.
ScrollableListView.java
Использование:
источник
Demo_ListView_In_ScrollView
==============================
========================
listview_adapter
==========================
===================================
Хелпер класс
====================================
========================
demo_listview_in_scrollview_activity.xml
========================
================
item_list_xml.xml
==================
источник
Лучшее решение - использовать NestedScrollVew с RecyclerView или, если вы хотите использовать Listview, вы можете добавить к этому представление верхнего и нижнего колонтитула. Например:
источник
Я попробовал и протестировал почти все методы, упомянутые выше, поверьте мне, после полного бегства от RecyclerView, я заменил свой ListView на RecyclerView, и он работал отлично. Не нужно было никакой сторонней библиотеки для ExtendedHeightListView и всего, просто и понятно RecyclerView.
Итак, вот мой файл Layout перед recyclerView:
ЭТО ПОСЛЕ ЗАМЕНЫ МОЕГО LISTVIEW ОДИН ИЗ МНОГИХ РЕШЕНИЙ, О КОТОРЫХ ОЗНАКОМЛЯЕТСЯ ВЫШЕ. Таким образом, проблема была в том, что просмотр списка не работал должным образом из-за ошибки 2 scrollview (возможно, не ошибка) в Android.
Я заменил представление с переработчиком, чтобы сформировать мой окончательный макет.
Это мой видоискатель:
И это мой пользовательский макет RecyclerView:
И VOILA, я получил желаемый эффект ListView (теперь RecyclerView) в scollview. Вот окончательный образ пользовательского интерфейса
В заключение отметим, что я считаю, что замена RecyclerView была для меня лучшим выбором, поскольку она повысила общую стабильность приложения, а также помогла мне лучше понять RecyclerView. Если бы я предложил решение, я бы сказал, замените ваш ListView на RecyclerView.
источник
Вышеуказанное решение @Shailesh Rohit прекрасно работает. Некоторые трюки должны быть сделаны.
Если вы помещаете вспомогательный класс в тот же класс (основной класс), то сделайте класс Helper статическим, а getListViewSize () не будет статичным.
Наиболее важно написать «Helper.getListViewSize (listView);» оператор после установки адаптера в первый раз, например "listView.setAdapter (myAdapter);" а также когда вы когда-либо используете "myAdapter.notifyDataSetChanged ();"
Использование показано ниже.
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);
источник
Как по мне, пока вы используете setOnTouchListener om parent или child, остановите прокрутку родительского элемента, когда вы касаетесь дочернего элемента, иначе прекратите прокрутку дочернего элемента, когда вы касаетесь родительского элемента.
источник
Попробуйте это с ScrollView, а не с ListView.
источник
requestDisallowInterceptTouchEvent (логическое значение disallowIntercept)
Попробуйте этот ответ,
источник
замените ListView на RecycleView внутри ScrollView. он работает без дополнительного исходного кода:
источник
Для ListView внутри ScrollView используйте NestedScrollView, он может очень легко справиться с этой функциональностью:
источник
У меня была эта ошибка. И мое решение выглядит следующим образом:
1. Создайте пользовательский список, который нельзя прокручивать
}
2. Используйте вышеуказанный пользовательский класс для файла XML
Надеюсь, лучше для вас.
источник
Я нашел решение для этого, вместо использования scrollview, вы можете использовать addHeaderview и addFooterview listview
Вот мой фрагмент,
Теперь при просмотре списка ваш макет также можно прокручивать. Наслаждайся этим!!!
источник
Замените ScrollView на android.support.v4.widget.NestedScrollView внутри xml. это работает
1) Использование в XML ::::
android.support.v4.widget.NestedScrollView
вместо того::::
ScrollView
2) И использовать для просмотра списка таким образом, используя NonScrollListView в файле CS:
3) Наконец, используйте этот код для идентификации scrollview в файле cs:
источник
Лучший код
источник
Добавить:
android:nestedScrollingEnabled="true"
источник
Используйте этот метод, и ваш просмотр списка станет прокручиваемым внутри прокрутки: -
источник
Вы не можете добавить ListView в представление с прокруткой, так как представление списка также прокручивается, и возникает проблема синхронизации между прокруткой просмотра списка и прокруткой просмотра прокрутки. Вы можете создать представление CustomList и добавить в него этот метод.
источник
Не показывать прокрутку
ListView
, потому что он имеет эту настройку по умолчаниюисточник