GridView mGrid= (GridView) findViewById(Ridgridview);
LinearLayoutLayoutParams linearParams = (LinearLayoutLayoutParams) mGridgetLayoutParams(); // 取控件mGrid当前的布局参数
linearParamsheight = 75;// 当控件的高强制设成75象素
mGridsetLayoutParams(linearParams); // 使设置好的布局参数应用到控件mGrid2
自定义GridView以解决ScrollView嵌套Android自身GridView出现的疑难问题 Android开发中偶尔会遇到ScrollView嵌套GridView情景,但是谷歌官网是不推荐这种方式的,因为他们都有滚动条,嵌套使用会有冲突,无奈只能另谋他路,自定义个仿GridView的控件 1定义attrsxml文件 <declare-styleable name=“
因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。如下:
public class NoScrollGridView extends GridView {
public NoScrollGridView(Context context) {
super(context);
}
public NoScrollGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpecmakeMeasureSpec(IntegerMAX_VALUE >> 2,MeasureSpecAT_MOST);
superonMeasure(widthMeasureSpec, expandSpec);
}
}
ListView也同理。
还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:
/
重新计算listView高度
@param listView
/
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listViewgetAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdaptergetCount(); i < len; i++) { // listAdaptergetCount()返回数据项的数目
View listItem = listAdaptergetView(i, null, listView);
listItemmeasure(0, 0); // 计算子项View 的宽高
totalHeight += listItemgetMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroupLayoutParams params = listViewgetLayoutParams();
paramsheight = totalHeight
+ (listViewgetDividerHeight() (listAdaptergetCount() - 1));
// listViewgetDividerHeight()获取子项间分隔符占用的高度
// paramsheight最后得到整个ListView完整显示需要的高度
listViewsetLayoutParams(params);
}
在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);
因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:
/
计算gridview高度
@param gridView
/
public static void setGridViewHeightBasedOnChildren(GridView gridView) {
// 获取GridView对应的Adapter
ListAdapter listAdapter = gridViewgetAdapter();
if (listAdapter == null) {
return;
}
int rows;
int columns = 0;
int horizontalBorderHeight = 0;
Class<> clazz = gridViewgetClass();
try {
// 利用反射,取得每行显示的个数
Field column = clazzgetDeclaredField("mRequestedNumColumns");
columnsetAccessible(true);
columns = (Integer) columnget(gridView);
// 利用反射,取得横向分割线高度
Field horizontalSpacing = clazz
getDeclaredField("mRequestedHorizontalSpacing");
horizontalSpacingsetAccessible(true);
horizontalBorderHeight = (Integer) horizontalSpacingget(gridView);
} catch (Exception e) {
// TODO: handle exception
eprintStackTrace();
}
// 判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
if (listAdaptergetCount() % columns > 0) {
rows = listAdaptergetCount() / columns + 1;
} else {
rows = listAdaptergetCount() / columns;
}
int totalHeight = 0;
for (int i = 0; i < rows; i++) { // 只计算每项高度行数
View listItem = listAdaptergetView(i, null, gridView);
listItemmeasure(0, 0); // 计算子项View 的宽高
totalHeight += listItemgetMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroupLayoutParams params = gridViewgetLayoutParams();
paramsheight = totalHeight + horizontalBorderHeight (rows - 1);// 最后加上分割线总高度
gridViewsetLayoutParams(params);
}
这样我们就可以在ListView中添加GridView了。。。
注:两个SrcollView型的控件可以是:
<ListView, GridView>;
<GridView,ListView>;
<ListView,ListView>;
<GridView, GridView>;
<ListView, ScrollView>;
<ScrollView,ListView>;
<GridView, ScrollView>;
<ScrollView, GridView>;
<ScrollView, ScrollView>;
楼主你好:
自定义一个GridView,然后重写GridView的onMeasure(int widthMeasureSpec, int heightMeasureSpec)的方法,将GridView重新测量,然后指定GridView的新的高度。
package comyuedongmobiview;
import androidcontentContext;
import androidutilAttributeSet;
import androidwidgetGridView;
/
/
public class MyGridView extends GridView {
public MyGridView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MyGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int expandSpec = MeasureSpecmakeMeasureSpec(IntegerMAX_VALUE >> 2, MeasureSpecAT_MOST);
superonMeasure(widthMeasureSpec, expandSpec);
}
}
然后你对新GridView赋值即可。
以上就是关于android 自定义view的高度设置问题全部的内容,包括:android 自定义view的高度设置问题、安卓gridview的item高度不同导致重叠,怎样解决、为什么android gridview只能显示一行数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)