我要设计布局,使得整个布局应滚动和内部布局我必须显示相关内容的Grid
形式,所以我决定用GridView
。但问题是,我无法使用GridView
内ScrollView
我已阅读的文档(文档也说我们不应该使用GridView
内ScrollView
)also.But我必须这样做,这样可以在任何请给我约this.Thanks一些想法
Answer 1:
有一定的内在滚动旁边一个GridView的好处。 例如,基于数据单元,将扩大和合同一致,动态布局你进入它。 所以,当人们说这不是好渴望这样一个功能,我认为这是错误的,因为你能想到的图片(视图)的动态网格滚动视图内,但希望是整个滚动视图包含其他的东西不仅仅是网格细胞。
现在,这里是你如何能做到这一点。 检查答案在这里 。 这是一个高度可扩展的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总会扩大其高度,以适应在它的内容,因此从来没有允许它进入其滚动模式。 这使您可以使用它的滚动型的内部和滚动型中使用高于或低于它的其他视图元素,并使它们全部滚动。
这应该给你你正在寻找的结果。 让我知道如果您有任何问题。
Answer 2:
我知道我迟到了,但我有我必须共享和完美的作品另一种解决方案。 在这里,该方法计算基于项目的数量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);
}
之后你调用setAdapter
在你的GridView,只需调用
setGridViewHeightBasedOnChildren( <yourGridView> , <no of grid view columns> )
它会工作。
您可以定义在GridView在XML平时一样
并让代码照顾它。 :)
Answer 3:
我发现了一个方法,让GridView控件 内滚动型固定的大小,并启用其滚动 。 这让你看到整个滚动型,而无需滚动GridView中的所有元素,而且它是用ExpandableHeightGridView让我更有意义。
要做到这一点,你就必须实现一个新的类扩展GridView和覆盖的onTouchEvent()调用requestDisallowInterceptTouchEvent(真)。 因此,父视图会离开网格拦截触摸事件。
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 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);
我希望它有助于=)
Answer 4:
要使用的GridView内滚动视图,设置滚动型机器人:fillViewport =“真”
我知道它的晚在这里回答,但可能是一些新的开发人员非常有用。
Answer 5:
如果你已经使用dennisdrew的答案,你有你的网格上面的内容,当你打开你的看法它被隐藏只需添加下面的最后一行
ExpandableHeightGridView gridView = (ExpandableHeightGridView) findViewById(R.id.myId);
gridView.setAdapter(yourAdapter);
gridView.setExpanded(true);
gridView.setFocusable(false);
Answer 6:
我也希望做一个嵌套的滚动视图内滚动网格视图。
另一个问题这个答案让我: https://stackoverflow.com/a/38612612
使你的GridView属性为
android:nestedScrollingEnabled="true"
楼主: Droid_Dev
Answer 7:
这是更好地使用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();
进一步的信息探索下面演示的示例
http://www.londatiga.net/it/programming/android/make-android-listview-gridview-expandable-inside-scrollview/
Answer 8:
我不会强迫的问题。 GridView控件不滚动型很好地工作。 而不是转换你的GridView成recyclerview并使用gridLayoutManager来解决问题。