it-swarm.com.de

So fügen Sie GridView in ScrollView ein

Ich muss das Layout so gestalten, dass das gesamte Layout durchlaufen und innerhalb des Layouts angezeigt werden muss. Ich muss verwandte Inhalte in Grid-Form anzeigen. Ich entschied mich daher für GridView. Das Problem ist jedoch, dass ich GridView nicht in ScrollView verwenden kann zu sagen, dass wir GridView nicht innerhalb von ScrollView) verwenden sollten. Aber ich muss das tun, also kann mir jeder eine Idee dazu geben. Danke

63
Dilip

Neben dem inhärenten Scrollen bietet ein GridView durchaus Vorteile. Beispielsweise ein konsistentes, dynamisches Layout von Zellen, das sich basierend auf den von Ihnen übergebenen Daten erweitert und zusammenzieht. Wenn die Leute sagen, dass es nicht gut ist, eine solche Funktionalität zu wünschen, ist dies meiner Meinung nach falsch, weil Sie das dynamische Raster von Bildern (Ansichten) in einer Bildlaufansicht haben möchten, die gesamte Bildlaufansicht jedoch andere Elemente als nur das Gitter enthalten soll Zellen. 

Jetzt können Sie dies tun. Überprüfen Sie die Antwort hier . Es ist eine GridView mit erweiterbarer Höhe, die Sie in Ihr Projekt importieren/erstellen möchten. Das bedeutet im Wesentlichen, dass, wenn mehr Elemente zur GridView hinzugefügt werden, diese nur ihre Höhe vergrößert, anstatt die Höhe festzusetzen und Scrollen zu verwenden. Genau das wollen Sie.

Wenn Sie die ExpandableHeightGridView in Ihrem Projekt installiert haben, wechseln Sie zu Ihrem XML-Layout, in dem sich die GridView befinden soll. Sie können dann so etwas tun (paraphrasieren):

<ScrollView ...>
    <RelativeLayout ...>
        <com.example.ExpandableHeightGridView ... />
        <other view items />
    </RelativeLayout>
</ScrollView>

Anschließend möchten Sie in Ihrer Aktivität, in der Sie den GridView-Adapter festlegen, sicherstellen, dass Sie die Erweiterung erweitern. So:

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

Der Grund, warum Sie diese erweiterbare GridView wünschen, besteht darin, dass die Tatsache, dass eine Standard-GridView nicht erweitert wird, zu einem Bildlauf führt. Es bleibt auf einer bestimmten Höhe, und wenn es mehr Elemente über seine Sichtgrenzen hinaus füllen, wird es scrollbar. Damit vergrößert Ihr GridView immer seine Höhe, um es dem Inhalt anzupassen, sodass es niemals in den Bildlaufmodus gelangen kann. Auf diese Weise können Sie es innerhalb der ScrollView verwenden und andere Ansichtselemente darüber oder darunter innerhalb der ScrollView verwenden und alle scrollen lassen.

Dies sollte Ihnen das gewünschte Ergebnis liefern. Lassen Sie mich wissen, wenn Sie Fragen haben.

106
dennisdrew

Ich weiß, ich bin spät dran, aber ich habe eine andere Lösung, die ich teilen muss und die einwandfrei funktioniert. Hier berechnet die Methode die GridView-Höhe basierend auf der Anzahl der enthaltenen Elemente und legt die Höhe zur Laufzeit auf GridView fest. 

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);

}

Nachdem Sie setAdapter in Ihrem Gridview aufgerufen haben, rufen Sie einfach auf 

setGridViewHeightBasedOnChildren( <yourGridView> , <no of grid view columns> )

und es wird funktionieren.

Sie können die Rasteransicht wie gewohnt in Ihrer XML-Datei definieren

und lassen Sie den Code sich darum kümmern. :)

32
Vikram Gupta

Ich habe einen Weg gefunden, dem GridView eine feste Größe in ScrollView zu geben und das Scrollen zu aktivieren . Auf diese Weise können Sie die gesamte ScrollView anzeigen, ohne alle Elemente der GridView scrollen zu müssen. Für mich ist es sinnvoller, wenn Sie eine ExpandableHeightGridView verwenden.

Dazu müssen Sie eine neue Klasse implementieren, die GridView erweitert und onTouchEvent () überschreibt, um requestDisallowInterceptTouchEvent (true) ..__ aufzurufen. Auf diese Weise hinterlässt die übergeordnete Ansicht die Berührungsereignisse für die Interaktion zwischen Grids.

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);
    }
}

Fügen Sie es in Ihrem Layout mit den gewünschten Merkmalen und Rändern in einer ScrollView hinzu:

<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>

Und hol es dir einfach in deine Aktivität:

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

Ich hoffe es hilft =)

10
Lionel T.

Um die Rasteransicht in der Scrollansicht zu verwenden, setzen Sie die Scrollview-App Android: fillViewport = "true" 

Ich weiß, dass es spät ist, hier zu antworten, kann aber für einige neue Entwickler nützlich sein.

Wenn Sie die Antwort von dennisdrew verwendet haben und der Inhalt über Ihrem Raster liegt, wird er beim Öffnen der Ansicht ausgeblendet. Fügen Sie einfach die letzte Zeile hinzu

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

Es ist besser, ExpandableHeightlistView oder ExpandableHeightGridView in scrollview zu verwenden.

Logik

Berechnen Sie die gesamte Höhe, indem Sie einen sehr großen Höhenhinweis angeben. Verwenden Sie jedoch nicht die höchsten 2 Bits dieser Ganzzahl. diese sind für den MeasureSpec-Modus reserviert.

int expandSpec = MeasureSpec.makeMeasureSpec(
 Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
 super.onMeasure(widthMeasureSpec, expandSpec);

 ViewGroup.LayoutParams params = getLayoutParams();
 params.height = getMeasuredHeight();

weitere Informationen finden Sie im folgenden Beispiel mit der Demo

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

1
Kishore Reddy

Ich habe auch versucht, eine Rasteransicht in einer verschachtelten Scrollansicht scrollbar zu machen.

Diese Antwort auf eine andere Frage hat mir geholfen: https://stackoverflow.com/a/38612612

Aktivieren Sie Ihre GridView-Eigenschaft als

Android:nestedScrollingEnabled="true"

Originalposter: Droid_Dev

1
Stephen Emery

ich würde das Problem nicht erzwingen. GridView funktioniert nicht gut in einem ScrollView. Konvertieren Sie stattdessen Ihre Rasteransicht in eine Recyclingübersicht und beheben Sie das Problem mithilfe eines gridLayoutManagers. 

0
j2emanue