Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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();

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

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

Ответ 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