ScrollView和包含滚动功能的复杂子视图

时间:2014-11-08 09:44:43

标签: android android-layout gridview scrollview

我的一个关于android的观点出了问题,它的结构非常复杂。

基本上,我要实现的目标是这样的:

滚动视图,其中包含一些包含内容的视图,但最后一个视图具有gridview。问题是没有设置网格视图的精确高度(以及包装内容)...滚动不允许滚动到此网格的末尾。我不想在这个GridView中使用滚动,我使用这个小部件来简化数据填充并使用内置控件和适配器。

我的XML:

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

<ScrollView
    android:id="@+id/scrollview_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            // some relevant subviews

        </LinearLayout>

        // here problem starts
        <GridView
            android:id="@+id/grid_products"
            android:layout_width="match_parent"
            android:minHeight="50dp"
            android:layout_height="wrap_content" />
        // here problem ends

    </LinearLayout>

</ScrollView>

我尝试使用覆盖的onMesure提供自定义scrollView,也尝试使用onResume invalidateScroll并使用computeScroll方法。

以下是覆盖onMesure的一些代码:

 @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,MeasureSpec.AT_MOST);

    super.onMeasure(widthMeasureSpec, expandSpec);

    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
    params.height = getMeasuredHeight()+10000;
    setLayoutParams(params);

    invalidate();
    requestLayout();
}

但是没有运气......我仍然需要为layout_height提供准确的值,否则它不可见并且无法通过滚动来访问。

我进行了很多实验,现在不知道,我接下来可以检查什么以及做些什么。

提前感谢您的帮助, 关心大卫

使用工作解决方案更新

这适用于我https://stackoverflow.com/a/8483078/566817的自定义GridView类,里面有这个方法:

public int measureRealHeight(Context context)
{
    final int columnsCount = 3;
    final int screenWidth = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();
    final double screenDensity = getResources().getDisplayMetrics().density;
    final int columnWidth = (int) (screenWidth / columnsCount + screenDensity + 0.5f);
    final int verticalSpacing = (int) context.getResources().getDimension(R.dimen.grid_spacing_vertical);
    final int rowsCount = getAdapter().getCount() / columnsCount + (getAdapter().getCount() % columnsCount == 0 ? 0 : 1);

    return columnWidth * rowsCount + verticalSpacing * (rowsCount - 1);
}

还需要在onResume方法中更新片段中的LayoutParams:

@Override
public void onResume()
{
    super.onResume();

    int realHeight = gridViewProducts.measureRealHeight(getActivity());
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) gridViewProducts.getLayoutParams();
    lp.height = realHeight;
    gridViewProducts.setLayoutParams(lp);
    gridViewProducts.requestLayout();
}

我的XML网格

<xxx.CustomGridView
            android:id="@+id/grid_products"
            android:isScrollContainer="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="3" />

到目前为止,我花了很多时间,到目前为止还没有更好的解决方案(我知道它不是完美的解决方案)。

我希望它会帮助某人:)

0 个答案:

没有答案