android 自定义view的高度设置问题

android 自定义view的高度设置问题,第1张

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只能显示一行数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9575130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存