У меня есть макет Android, который имеет scrollView
несколько элементов с в нем. В нижней части у scrollView
меня есть, listView
который затем заполняется адаптером.
Проблема, которую я испытываю, заключается в том, что Android исключает listView
из, scrollView
поскольку scrollView
уже имеет функцию прокрутки. Я хочу, listView
чтобы содержимое было таким же, как и содержимое, и чтобы представление основного прокрутки имело возможность прокрутки.
Как я могу добиться этого поведения?
Вот мой основной макет:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >
<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
Затем я программно добавить свои компоненты в linearlayour с идентификатором: foodItemActvity_linearLayout_fragments
. Ниже приведено одно из представлений, загруженных в этот линейный макет. Это тот, кто доставляет мне неприятности со свитками.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Мой адаптер затем заполняет этот список.
Вот изображение из средства просмотра иерархии Android, когда я нажимаю на главный scrollView:
Как видите, это исключение списка просмотра отзывов.
Я должен быть в состоянии прокрутить страницу вниз и увидеть 8 отзывов, но вместо этого он показывает только эти 3, и я могу прокрутить крошечную часть, где находятся отзывы. Я хочу глобальную прокрутку страницы
источник
Ответы:
Самое короткое и простое решение для любого ChildView для прокрутки внутри ScrollView . Что-нибудь вроде ListView, RecyclerView и т. Д. Вам не нужно делать ничего особенного в коде.
Просто замените ScrollView на android.support.v4.widget.NestedScrollView в текущем xml, и тогда произойдет волшебство.
Ниже приведен пример XML-кода:
Теперь вы можете избавиться от всех уродливых хаков, которые мы сделали, чтобы обойти эту вложенную прокрутку.
Время играть. Черт, даааааааааааааааа!
источник
requestLayout()
- метод setLayoutParams уже делает это.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
Ответ прост, и я удивлен, что здесь еще нет ответа.
Используйте
Header View
или или иFooter View
в самом списке. Не смешивайтеScrollView
сListView
или что-нибудь, что может прокрутить. Он предназначен для использования с верхними и нижними колонтитулами :)По сути, возьмите все содержимое над ListView, поместите его в другой файл .xml в качестве макета, а затем в коде надуйте его и добавьте в список в качестве представления заголовка.
т.е.
источник
Я знаю, что это было так долго, но я тоже получил эту проблему, попробовал это решение, и оно работает. Поэтому я думаю, что это может помочь и другим.
Я добавляю android: fillViewport = "true" в XML-макет для scrollView. Так что в целом мой ScrollView будет таким.
И это работает как волшебство для меня. ListView, который находится внутри моего ScrollView, снова расширяется до своего размера.
Вот полный пример кода для ScrollView и ListView.
источник
Вы создаете пользовательский ListView, который не прокручивается
В вашем файле ресурсов макета
В Java-файле создайте объект вашего customListview вместо ListView, например: NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
источник
Вы можете использовать этот код для просмотра списка в scrollview
источник
ListView
внутри,RecyclerView
чтобы показать больше, чем 1-й элемент.Вы можете решить это, добавив
android:fillViewport="true"
в свой ScrollView.до использования этого свойства был виден только один дочерний элемент моего списка. после этого все строки или дочерние элементы списка становятся видимыми.
источник
Ничего не делать в родительском ScrollView. Сделайте это только для дочернего ListView. Все будет отлично работать.
источник
Этот код решит вашу проблему, если вы внедрили в код только ListView.
Если вы используете RelativeLayout в качестве дочернего элемента ListView, этот код возвращает здесь исключение NullPointerException listItem.measure (0, 0); , из-за RelativeLayout. И решение помещает ваш Relativelayout в LinearLayout, и он будет работать нормально.
источник
Я оставлю это здесь на случай, если кто-то столкнется с той же проблемой. Я должен был поместить ListView внутри ScrollView. ListView с заголовком не был вариантом по ряду причин. Также не было возможности использовать LinearLayout вместо ListView. Поэтому я следовал принятому решению, но оно не сработало, потому что элементы в списке имели сложную компоновку с несколькими строками, а каждый элемент списка имел переменную высоту. Высота была измерена не правильно. Решением было измерить каждый элемент внутри метода getView () адаптера ListView.
источник
Вы можете легко поместить ListView в ScrollView! Просто нужно высоту изменения в ListView программно , например:
Это работает отлично!
источник
Сделано после большого количества исследований и разработок:
Fragment_one.xml должен выглядеть так:
Ваш Java-класс FragmentOne.java выглядит следующим образом:
onCreateView
источник
У меня была такая же проблема, как и у оригинального плаката - как сделать прокрутку списка внутри прокрутки - и этот ответ решил мою проблему. Отключить прокрутку ListView, содержащегося в ScrollView
Я не вызывал новые фрагменты в существующие макеты или что-то подобное, как это делал OP, поэтому мой код выглядел бы примерно так:
По сути, я проверяю длину списка перед тем, как я его вызываю, и когда я его называю, я делаю его на такую длину. В вашем Java-классе используйте эту функцию:
И вызвать функцию следующим образом:
Результатом является представление списка без полосы прокрутки, отображаемой по всей длине просмотра списка, которое прокручивается с помощью полосы прокрутки просмотра прокрутки.
источник
Как уже упоминали другие, не используйте ListView внутри ScrollView.
Чтобы обойти это, вы можете использовать LinearLayout, но чтобы все было аккуратно - заполните LinearLayout адаптером, так же, как вы делаете с ListView.
Вы можете использовать этот класс в качестве замены LinearLayout, которая поддерживает адаптеры
источник
Вы можете поместить все в линейное расположение. То есть создайте линейный макет, и у него будет 2 дочерних элемента, scrollview и другой линейный макет. Дайте им веса макета, и вот вы:
источник
Вы никогда не должны использовать ScrollView с ListView, потому что ListView заботится о своей собственной вертикальной прокрутке. Что наиболее важно, выполнение этого снимает все важные оптимизации в ListView для работы с большими списками, поскольку фактически заставляет ListView отображать весь список элементов, чтобы заполнить бесконечный контейнер, предоставляемый ScrollView.
http://developer.android.com/reference/android/widget/ScrollView.html
источник
Мое требование - включить ListView элементов одинакового размера в ScrollView. Я попробовал несколько других решений, перечисленных здесь, но ни одно из них не соответствовало правильному размеру ListView (либо слишком мало места, либо слишком много). Вот что сработало для меня:
Надеюсь, это кому-нибудь поможет.
источник
НИКОГДА не кладите
ListView
внутрьScrollView
! Вы можете найти больше информации на эту тему в Google . В вашем случае используйтеLinearLayout
вместоListView
и добавьте элементы программно.источник
Обновить
в
Дело в том, что вы пытаетесь установить высоту 0dp (исправлено)
источник
нашел решение для scrollview -> viewpager -> FragmentPagerAdapter -> фрагмент -> динамический просмотр списка, но я не автор. есть некоторые ошибки, но, по крайней мере, это работает
макет фрагментов может быть любым
тогда где-то просто
источник
Чтобы использовать просмотр списка внутри Scroll-view, вы можете выполнить следующие шаги, которые работали для меня:
1) Создайте Java-файл NonScrollListView, который отключает свойство прокрутки по умолчанию для просмотра списка. и код ниже
2) Теперь создайте XML-файл, который имеет
NestedScrollView
и внутри этого использованияNonScrollListView
для перечисления ваших предметов. Это заставит весь ваш экран прокручивать все просмотры.3) Теперь в Java-классе, т. Е. Home.java определить
NonScrollListView
вместоListview
.публичный класс дома расширяет Fragment {int pos = 0; ViewFlipper v_flipper;
Примечание: я использовал
Fragments
здесь.источник
Хорошо, вот мой ответ. Метод, который фиксирует высоту ListView, достаточно закрыт, но не идеален. В случае, если большинство предметов имеют одинаковую высоту, это работает хорошо. Но если это не так, то есть большая проблема. Я пытался много раз, и когда я поместил в список значения listItem.getMeasureHeight и listItem.getMeasuerWidth, я увидел, что значения ширины сильно меняются, чего здесь не ожидается, поскольку все элементы в одном и том же ListView должны имеют одинаковую ширину. И там ошибка:
Некоторые использовали меру (0, 0), которая фактически делала представление свободным как в направлении, так и в ширину. Некоторые пытались получить ширину listView, но потом возвращали 0, бессмысленно.
Когда я читаю дальше, как андроид отображает представление, я понимаю, что все эти попытки не могут найти ответ, который я искал, если только эти функции не выполняются после отображения представления.
На этот раз я использую getViewTreeObserver в ListView, который я хочу зафиксировать высоту, а затем addOnGlobalLayoutListener. Внутри этого метода я объявляю новый OnGlobalLayoutListener, в котором на этот раз getWidth возвращает фактическую ширину ListView.
Панель значений - это отступ, который я установил в макете ListView.
источник
Если по какой-то причине вы не хотите использовать
addHeaderView
иaddFooterView
, например, когда у вас есть несколько списков, хорошей идеей будет повторное использованиеListAdapter
для заполнения простого,LinearLayout
чтобы не было функции прокрутки.Если у вас уже есть целый фрагмент, полученный из,
ListFragment
и вы хотитеLinearLayout
вместо этого преобразовать его в аналогичный фрагмент с простым без прокрутки (например, чтобы поместить его в ScrollView), вы можете реализовать фрагмент адаптера следующим образом:Вы можете также направить
onCreate
,onPause
,onResume
и т.д. , для исходного фрагмента в зависимости от ваших потребностей или попробовать наследование вместо композиции (но переопределить некоторые методы настолько оригинален фрагмент фактически не прилагается к иерархии макета); но я хотел как можно больше выделить оригинальный фрагмент, потому что нам нужно только извлечь егоListAdapter
. Если вы звоните исходный фрагментsetListAdapter
в системеonAttach
, достаточно вероятно.Вот как использовать,
ListAsArrayFragment
чтобы включитьOriginalListFragment
без прокрутки. В родительской деятельностиonCreate
:источник
нашел решение для scrollview -> viewpager -> FragmentPagerAdapter -> фрагмент -> динамический просмотр списка, но я не автор.
макет фрагментов может быть любым
тогда где-то просто
источник
с помощью этого ListView работал для меня
и в XML
и в MainActivity
Обратитесь к этой статье за дополнительной информацией, а также чтобы узнать, как сохранить вид сетки внутри вида прокрутки
источник
В xml:
В Java:
источник
Просто установите значение необходимой высоты в атрибуте высоты списка в родительском представлении прокрутки. Он будет прокручиваться вместе с дочерним элементом других родителей.
источник
Это сработало для меня ( ссылка 1 , ссылка 2 ):
Вы создаете пользовательский ListView, который не прокручивается
В вашем файле макета
Создайте объект вашего customListview вместо ListView, например:
источник
Просто вызовите эту функцию после назначения адаптера для просмотра списка
источник
источник
лучший код
источник