Мне нужно спроектировать макет, чтобы весь макет должен прокручиваться и внутри макета мне приходилось отображать связанный контент в форме Grid
, поэтому я решил использовать GridView
. Но проблема в том, что Im не смог использовать GridView
внутри ScrollView
Я прочитал документацию (Документация также говорит, что мы также не должны использовать GridView
внутри ScrollView
). Но я должен это сделать, так что, пожалуйста, дайте мне некоторое представление об этом. Спасибо
Как установить GridView внутри ScrollView
Ответ 1
Есть определенные преимущества для GridView помимо встроенной прокрутки. Например, последовательная динамическая компоновка ячеек, которая будет расширяться и сжиматься на основе данных, которые вы передаете в нее. Поэтому, когда люди говорят, что нехорошо желать такой функциональности, я думаю, что это неправильно, потому что вы можете хотеть динамическую сетку изображений (просмотров) внутри прокрутки, но хотите, чтобы весь прокручиваемый вид содержал другие вещи, а не только сетку клетки.
Теперь, вот как вы можете это сделать. Проверьте ответ здесь. Это расширяемая высота GridView, которую вы захотите импортировать/создать в своем проекте. В основном это означает, что по мере добавления большего количества элементов в GridView он просто увеличит свою высоту, в отличие от сохранения его высоты и использования прокрутки. Это именно то, что вы хотите.
Как только у вас есть проект ExpandableHeightGridView в вашем проекте, перейдите в свой XML-макет, где вы хотите GridView. Затем вы можете сделать что-то вроде этого (перефразируя):
<ScrollView ...>
<RelativeLayout ...>
<com.example.ExpandableHeightGridView ... />
<other view items />
</RelativeLayout>
</ScrollView>
Затем в вашей деятельности, где вы устанавливаете адаптер GridView, вы хотите, чтобы вы установили его для расширения. Итак:
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
Причина, по которой вы хотите этот расширяемый GridView, заключается в том, что тот факт, что стандартный GridView не расширяется, вызывает зависание. Он прилипает к определенной высоте, а затем, когда количество элементов заполняет его за пределы его видимости, оно становится прокручиваемым. Теперь, с этим, ваш GridView всегда будет расширять свою высоту, чтобы соответствовать содержанию внутри него, поэтому никогда не позволял ему входить в свой режим прокрутки. Это позволяет использовать его внутри ScrollView и использовать другие элементы представления над или под ним в ScrollView и прокручивать их все.
Это даст вам результат, который вы ищете. Дайте мне знать, если у вас есть вопросы.
Ответ 2
Я знаю, что опаздываю, но у меня есть другое решение, которое я должен использовать, и которое работает безупречно. Здесь метод вычисляет высоту 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( <yourGridView> , <no of grid view columns> )
и он будет работать.
Вы можете определить gridview в своем xml, как обычно,
и пусть код позаботится об этом.:)
Ответ 3
Я нашел способ предоставить GridView фиксированный размер внутри ScrollView и разрешить прокрутку. Это позволяет вам видеть весь ScrollView без необходимости прокрутки всех элементов GridView, и для меня имеет смысл больше использовать ExpandableHeightGridView.
Для этого вам нужно будет реализовать новый класс, расширяющий 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:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:isScrollContainer="true" >
<com.example.GridViewScrollable
android:id="@+id/myGVS"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth" />
</ScrollView>
И просто получите его в своей деятельности:
GridViewScrollable myGridView = (GridViewScrollable) findViewById(R.id.myGVS);
Я надеюсь, что это поможет =)
Ответ 4
Чтобы использовать gridview внутри scrollview, установите scrollview android: fillViewport = "true"
Я знаю, что он опоздал, чтобы ответить здесь, но может быть полезен для некоторых новых разработчиков.
Ответ 5
Я также хотел сделать прокрутку в виде сетки в представлении вложенных прокруток.
Этот ответ на другой вопрос помог мне: fooobar.com/questions/7144881/...
Включите свойство GridView как
android:nestedScrollingEnabled="true"
Оригинальный постер: Droid_Dev
Ответ 6
Если вы использовали ответ dennisdrew, и у вас есть контент над сеткой, и он скрывается, когда вы открываете свой вид, просто добавьте последнюю строку ниже
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
gridView.setFocusable(false);
Ответ 7
Лучше использовать 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();
для получения дополнительной информации изучите пример ниже с демо
Ответ 8
я бы не стал причиной этой проблемы. GridView не работает хорошо в scrollView. вместо этого преобразуйте gridview в recyclerview и используйте gridLayoutManager для решения проблемы.
Ответ 9
gridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
//Настройка Touch Listener для обработки касания внутри ScrollView