Как установить GridView внутри ScrollView

Мне нужно спроектировать макет, чтобы весь макет должен прокручиваться и внутри макета мне приходилось отображать связанный контент в форме Grid поэтому я решил использовать GridView Но проблема в том, что я не могу использовать GridView внутри ScrollView Я прочитал документацию (документация также говоря, что мы также не должны использовать GridView внутри ScrollView ). Но я должен это сделать, так что, пожалуйста, дайте мне некоторое представление об этом. Спасибо

Есть определенно преимущества для GridView помимо встроенной прокрутки. Например, последовательная динамическая компоновка ячеек, которая будет расширяться и сжиматься на основе данных, которые вы передаете в нее. Поэтому, когда люди говорят, что это нехорошо желать такой функциональности, я думаю, что это неправильно, потому что вы можете хотеть динамическую сетку изображений (просмотров) внутри прокрутки, но хотите, чтобы весь прокручиваемый вид содержал другие вещи, а не только сетку клетки.

Теперь, вот как вы можете это сделать. Проверьте ответ здесь . Это расширяемая высота GridView, которую вы захотите импортировать / создать в своем проекте. В основном это означает, что по мере добавления большего количества элементов в GridView он просто увеличит свою высоту, в отличие от сохранения его высоты и использования прокрутки. Это именно то, что вы хотите.

Когда у вас есть проект ExpandableHeightGridView в вашем проекте, перейдите в свой XML-макет, где вы хотите GridView. Затем вы можете сделать что-то вроде этого (перефразируя):

       

Затем в вашей деятельности, где вы устанавливаете адаптер GridView, вы хотите убедиться, что вы установите его для расширения. Так:

 ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId); gridView.setAdapter(yourAdapter); gridView.setExpanded(true); 

Причина, по которой вам нужен этот расширяемый GridView, заключается в том, что тот факт, что стандартный GridView не расширяется, является причиной его прокрутки. Он прилипает к определенной высоте, а затем, когда количество элементов заполняет его за пределы его видимости, оно становится прокручиваемым. Теперь, с этим, ваш GridView всегда будет расширять свою высоту, чтобы соответствовать содержанию внутри него, поэтому никогда не позволял ему входить в свой режим прокрутки. Это позволяет использовать его внутри ScrollView и использовать другие элементы представления над или под ним в ScrollView и прокручивать их все.

Это должно дать вам результат, который вы ищете. Дайте знать, если у вас появятся вопросы.

Я знаю, что опаздываю, но у меня есть другое решение, которое я должен разделять, и которое работает безупречно. Здесь метод вычисляет высоту GridView в зависимости от количества элементов, которые он содержит, и устанавливает высоту в GridView во время выполнения.

 public void setGridViewHeightBasedOnChildren(GridView gridView, int columns) { ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; int items = listAdapter.getCount(); int rows = 0; View listItem = listAdapter.getView(0, null, gridView); listItem.measure(0, 0); totalHeight = listItem.getMeasuredHeight(); float x = 1; if( items > columns ){ x = items/columns; rows = (int) (x + 1); totalHeight *= rows; } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight; gridView.setLayoutParams(params); } 

После того, как вы вызвали setAdapter в своем gridview, просто позвоните

 setGridViewHeightBasedOnChildren(  ,  ) 

и это сработает.

Вы можете определить gridview в своем xml, как обычно

и пусть код позаботится об этом. 🙂

Я нашел способ предоставить GridView фиксированный размер внутри ScrollView и включить прокрутку . Это позволяет вам видеть весь ScrollView без необходимости прокрутки всех элементов GridView, и для меня больше смысла использовать ExpandableHeightGridView .

Для этого вам нужно будет реализовать новый class, расширяющий GridView и переопределяющий onTouchEvent () для вызова requestDisallowInterceptTouchEvent (true) . Таким образом, родительский вид оставит события касания перехвата сетки.

GridViewScrollable.java:

 package com.example; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.GridView; public class GridViewScrollable extends GridView { public GridViewAdjuntos(Context context) { super(context); } public GridViewAdjuntos(Context context, AttributeSet attrs) { super(context, attrs); } public GridViewAdjuntos(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent ev){ // Called when a child does not want this parent and its ancestors to intercept touch events. requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(ev); } } 

Добавьте его в свой макет с характеристиками и полями, которые вы хотите, внутри ScrollView:

    

И просто получите его в своей деятельности:

 GridViewScrollable myGridView = (GridViewScrollable) findViewById(R.id.myGVS); 

Я надеюсь, что это поможет =)

Чтобы использовать gridview внутри scrollview, установите scrollview android: fillViewport = “true”

Я знаю, что он опоздал, чтобы ответить здесь, но может быть полезен для некоторых новых разработчиков.

Если вы использовали ответ dennisdrew и у вас есть контент над сеткой, и он скрывается, когда вы открываете свой вид, просто добавьте последнюю строку ниже

 ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId); gridView.setAdapter(yourAdapter); gridView.setExpanded(true); gridView.setFocusable(false); 

я бы не стал причиной этого. GridView не работает хорошо в scrollView. вместо этого преобразуйте gridview в recyclerview и используйте gridLayoutManager для решения проблемы.

Я также хотел сделать сетку вид прокручиваемой внутри вложенного просмотра прокрутки.

Этот ответ по другому вопросу помог мне: https://stackoverflow.com/a/38612612

Включите свойство GridView как

 android:nestedScrollingEnabled="true" 

Оригинальный постер: Droid_Dev

Лучше использовать ExpandableHeightlistView или ExpandableHeightGridView внутри scrollview .

логика

Вычислите всю высоту, указав подсказку очень большой высоты. Но не используйте самые высокие 2 бита этого целого; они зарезервированы для режима MeasureSpec.

 int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); 

для получения дополнительной информации ознакомьтесь с приведенным ниже примером с демонстрацией

http://www.londatiga.net/it/programming/android/make-android-listview-gridview-expandable-inside-scrollview/

  • Диалог для выбора изображения из галереи или с камеры
  • Как запретить Android делать снимок экрана, когда мое приложение переходит на задний план?
  • Как определить, когда телефон отвечает или отклонен
  • Как управлять кнопкой возврата в действии
  • Обработчик против AsyncTask
  • Как открыть галерею телефонов через код
  • ListView с OnItemClickListener android
  • Каковы различия между активностью и fragmentом
  • Активность камеры, возвращающая нулевой андроид
  • Программно введите секретный код, например * # * # 4636 # * # * на Android
  • Как сохранять cookie при использовании HTTPUrlConnection?
  • Давайте будем гением компьютера.