我的一个关于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" />
到目前为止,我花了很多时间,到目前为止还没有更好的解决方案(我知道它不是完美的解决方案)。
我希望它会帮助某人:)