web-dev-qa-db-ja.com

androidのScrollView内のGridViewに関する問題

AndroidのScrollView内にGridViewを配置しようとしています。 GridViewを配置すると機能しません。

こちらがレイアウトです。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/scroll_home"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <RelativeLayout 
            Android:id="@+id/layout_home" 
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">       

              <GridView xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:id="@+id/programacao_grid"
                Android:numColumns="auto_fit"
                Android:gravity="center"
                Android:columnWidth="50dp"
                Android:stretchMode="columnWidth"
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent"
                Android:layout_below="@+id/calendario_programacao"
             >       
            </GridView> 

    </RelativeLayout>

</ScrollView>

多くの検索の後、答えが見つかりました、それは以下です

20
Igor Ronner

検索した後、私はこのプロジェクトを見つけました link :-

ExpandableHeightGridViewクラス

package xx.xxx.xx.view;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.ViewGroup;
import Android.widget.GridView;

public class ExpandableHeightGridView extends GridView {

boolean expanded = false;

public ExpandableHeightGridView(Context context)
{
    super(context);
}

public ExpandableHeightGridView(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

public ExpandableHeightGridView(Context context, AttributeSet attrs,
        int defStyle)
{
    super(context, attrs, defStyle);
}

public boolean isExpanded()
{
    return expanded;
}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    // HACK! TAKE THAT Android!
    if (isExpanded())
    {
        // Calculate entire height by providing a very large height hint.
        // View.MEASURED_SIZE_MASK represents the largest height possible.
        int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);

        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();
    }
    else
    {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

public void setExpanded(boolean expanded)
{
    this.expanded = expanded;
} }

layout.xmlファイル:

<ScrollView
    Android:id="@+id/sc_spots"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:fillViewport="true" >


        <xx.xxx.xx.view.ExpandableHeightGridView
            Android:id="@+id/spotsView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="15dp"
            Android:layout_marginBottom="15dp"
            Android:layout_marginLeft="5dp"
            Android:layout_marginRight="5dp"
            Android:horizontalSpacing="10dp"
            Android:isScrollContainer="false"
            Android:numColumns="5"
            Android:stretchMode="columnWidth"
            Android:verticalSpacing="10dp" />
 </ScrollView>

GridViewクラスの使用

mGridView = (ExpandableHeightGridView)
getView().findViewById(R.id.spotsView);
mGridView.setExpanded(true);
SpotsAdapter adapter = new SpotsAdapter(getActivity(),R.layout.spot_item,params);
mGridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
76
Igor Ronner

これは私にとってはうまくいきます

   // Setting on Touch Listener for handling the touch inside ScrollView

       gridView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        return false;
                    }

                });
9

@Igor Ronnerが提供するソリューションは素晴らしいですが、未知の理由で私のアプリで半分の役割を果たしました-スクロールビュー内では、グリッドビューはまったく存在しないようにフラットになっています。

残りの半分を埋めようとする多くの試行錯誤で、ほぼ半日かかりました-相対レイアウトを使用してグリッドビューにラップし、次のように自動拡大させます(実際に動作する実際のコード!!!):

<RelativeLayout
    Android:id="@+id/grid_view_box"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/text_catalog"
    >

    <com.takken.app.Android.component.framework.ExpandableGridView
        Android:id="@+id/grid_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:numColumns="2"
        Android:horizontalSpacing="12dp"
        Android:verticalSpacing="12dp"
        />

</RelativeLayout>
0
Stephen Liu