我必须设计布局,使整个布局滚动,内部布局我必须以Grid
形式显示相关内容,所以我决定使用GridView
。但问题是我无法在GridView
内使用ScrollView
我已阅读文档(文档也说我们不应在GridView
内使用ScrollView
)。但我必须这样做,所以请任何请让我对此有所了解。谢谢
答案 0 :(得分:107)
除了固有滚动之外,GridView肯定有好处。例如,一个一致的,动态的单元格布局,它将根据您传入其中的数据进行扩展和收缩。因此,当人们说想要这样的功能并不好时,我认为这是错误的,因为你可能想要滚动视图内的动态网格图像(视图),但是希望整个滚动视图包含除了网格之外的其他内容细胞。
现在,您可以通过以下方式进行操作。检查答案here。它是一个可扩展的高度GridView,您需要在项目中导入/创建它。这基本上意味着随着更多项目被添加到GridView,它将只扩展其高度,而不是保持其高度设置和使用滚动。这正是你想要的。
在项目中拥有ExpandableHeightGridView后,转到您希望GridView所在的XML布局。然后你可以做这样的事情(释义):
<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中使用其上方或下方的其他视图元素,并将它们全部滚动。
这应该可以为您提供所需的结果。如果您有任何问题,请告诉我。
答案 1 :(得分:32)
我知道我迟到了,但我有另一种解决方案,我必须分享,哪种方式完美无瑕。这里,该方法根据它包含的项目数计算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);
}
在gridview上调用setAdapter
后,只需调用
setGridViewHeightBasedOnChildren( <yourGridView> , <no of grid view columns> )
它会起作用。
您可以像往常一样在xml中定义gridview
让代码处理它。 :)
答案 2 :(得分:10)
我找到了一种方法,可以将 GridView 固定大小放在ScrollView 中,然后启用滚动。这允许您在不必滚动GridView的所有元素的情况下查看整个ScrollView,使用 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);
我希望它有帮助=)
答案 3 :(得分:2)
要在scrollview中使用gridview,请设置scrollview android:fillViewport =&#34; true&#34;
我知道它在这里回答的时间较晚,但可能对一些新开发者有用。
答案 4 :(得分:1)
如果您使用了dennisdrew的答案,并且您的网格上方有内容,并且在您打开视图时它会被隐藏,只需添加下面的最后一行
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
gridView.setFocusable(false);
答案 5 :(得分:1)
最好在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();
有关详细信息,请参阅演示
以下示例答案 6 :(得分:1)
我还希望在嵌套滚动视图中滚动网格视图。
关于另一个问题的答案帮助了我:https://stackoverflow.com/a/38612612
启用GridView属性
android:nestedScrollingEnabled="true"
原创海报:Droid_Dev
答案 7 :(得分:0)
我不会强迫这个问题。 GridView在scrollView中不能很好地工作。而是将您的gridview转换为recyclerview并使用gridLayoutManager来解决问题。
答案 8 :(得分:0)
gridView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
//在Touch Listener上进行设置,以处理ScrollView内部的触摸
答案 9 :(得分:0)
如果您想在GridView
/ ScrollView
中使用RecyclerView
,则有两种情况:
如果要使GridView
的所有行都可见,请参见https://stackoverflow.com/a/63724794/2914140。
如果要在GridView
中显示一行,但要滚动(以显示其他行),请参阅https://stackoverflow.com/a/26852498/2914140。
答案 10 :(得分:0)
相信此解决方案对我有用!
android:nestedScrollingEnabled =“ true”
上方网格视图中的代码可滚动gridview 并设置宽度和高度 android:layout_width =“ match_parent” android:layout_height =“ 200sp”
即使在scrollview中也可以使用 感谢您之前的回答,我已经为之前的答案弄清楚了。 多亏了他们