Как установить GridView внутри ScrollView
Мне нужно спроектировать макет, чтобы весь макет должен прокручиваться и внутри макета мне приходилось отображать связанный контент в форме Grid
поэтому я решил использовать GridView
Но проблема в том, что я не могу использовать GridView
внутри ScrollView
Я прочитал документацию (документация также говоря, что мы также не должны использовать GridView
внутри ScrollView
). Но я должен это сделать, так что, пожалуйста, дайте мне некоторое представление об этом. Спасибо
- вопрос с "@id" против "@ + id" в позиционировании в Relative Layout
- Как подключиться к кнопке Power в Android?
- Неверный способ обработки fragmentации при изменении ориентации
- Как заставить Share Intent открыть конкретное приложение?
- В чем разница между отклонением или отменой диалога в Android?
- Eclipse JUNO не запускается
- Как автозапуск приложения для Android?
- Как создать стандартную утилиту для борьбы с андроидами?
Есть определенно преимущества для 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();
для получения дополнительной информации ознакомьтесь с приведенным ниже примером с демонстрацией