Android开发:GridView的item高度问题

Android开发:GridView的item高度问题,第1张

没有现成的方法,只能自己写。很麻烦。

再说就算实现了也很不美观。字少的textview不是要留很多空白?

建议你固定个适中的行数,能显示全的就显示,不能显示全的,鼠标移上去或者选择本行时再设置当前行的textview自动加高。这样既美观又方便使用。

在WEB程序的ASP页面中,都不建议使用该方法进行对数据的 *** 作!为什么呢?那为什么现在极大多网站都没有采用你这种方式来进行数据 *** 作呢?是别人没有想到?还是担心这样 *** 作会对页面造成额外的开销?提主,你有想过这个问题吗?

我是见过有grid的网站中,是没有一个像你这样 *** 作页面。通常都是获取当中一行的ID或可以获得对应数据的字段,再去查询一下数据库,再将数据返回到一个Table中对应的控件

下面是一个简单的GRIDVIEW代码:

页面代码:

<div>

<asp:GridView ID="gvTest" runat="server">

<Columns>

<asp:BoundField DataField="customerID" Visible="False" />

<asp:BoundField DataField="customerName" HeaderText="名称" />

<asp:BoundField DataField="customerSex" HeaderText="性别" />

<asp:TemplateField HeaderText=" *** 作">

<ItemTemplate>

<asp:LinkButton ID="lbtnUpdate" CommandArgument='<%# DataBinderEval(ContainerDataItem,"customerID") %>'

runat="server" Text="Update" OnClick="lbtnUpdate_Click"></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

</Columns>

</asp:GridView>

</div>

<br />

<div>

<table align="center">

<tr>

<td>

名称:</td>

<td>

<asp:TextBox ID="txtCustName" runat="server"></asp:TextBox></td>

</tr>

<tr>

<td>

性别:</td>

<td>

<asp:TextBox ID="txtCustSex" runat="server"></asp:TextBox></td>

</tr>

<tr>

<td colspan="2">

<asp:Button ID="btnUpdate" runat="server" Text="修改" Visible="false" OnClick="btnUpdate_Click" />

<asp:Button ID="btnCancel" runat="server" Text="取消" Visible="false" OnClick="btnCancel_Click" />

</td>

</tr>

</table>

</div>

<input type="hidden" id="txtCustID" runat="server" />

如下为后台代码:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

BindGrid();

}

}

//绑定Grid

private void BindGrid()

{

string strCmd = "select from CUSTOMERS";

//getDataSet函数通过一个SQL语句取得一个DataSet

DataSet ds = getDataSet(strCmd);

gvTestDataSource = ds;

gvTestDataBind();

}

//LinkButton事件,得到相关客户信息

protected void lbtnUpdate_Click(object sender, EventArgs e)

{

LinkButton lbtnTemp = sender as LinkButton;

//取得保存在LinkButton的CommandArgument的ID值

string custID = lbtnTempCommandArgument;

txtCustIDValue = custID;

string strCmd = stringFormat("select from CUSTOMERS where customerID = {0}", custID);

DataSet ds = getDataSet(strCmd);

//通过ID查询出来的客户信息赋给对应的控件

txtCustNameText = dsTables[0]Rows[0]["customerName"]ToString();

txtCustSexText = dsTables[0]Rows[0]["customerSex"]ToString();

//打开修改和取消按钮

btnCancelVisible = true;

btnUpdateVisible = true;

}

//修改

protected void btnUpdate_Click(object sender, EventArgs e)

{

string strCmd = "update CUSTOMERS set customerName='{0}',customerSex='{1}' where customerID={2}";

strCmd = stringFormat(strCmd, txtCustNameText, txtCustSexText, txtCustIDValue);

//ExecuteNon为执行修改的函数

int count = ExecuteNon(strCmd);

//屏蔽两个按钮

btnCancelVisible = false;

btnUpdateVisible = false;

}

//取消

protected void btnCancel_Click(object sender, EventArgs e)

{

//清空或还原Table中的控件

txtCustNameText = "";

txtCustSexText = "";

btnCancelVisible = false;

btnUpdateVisible = false;

}

注:

上面代码中我没有写连接或Command什么的,我觉得你会这些了再加上上面的代码只是带给你一种意识,供你参考!事例写得好潦草,只供参考,不推荐使用这样的编码方式!

你这个肯定是设置了gridview的height属性了,这样你就固定了gridview的高度,当数据不足是gridview的高度是不会变的,你可以把gridview的height属性删除掉,如果会影响布局的话可以在

gridview的RowDataBound数据下加入以下代码:

eRowAttributesAdd("style",

"height:43px");这样来设定行高

自动生成的GridView无法修改列宽,使用ItemStyle

可以设置

<asp:GridView

ID="GridView1"

runat="server"

AutoGenerateColumns="False">

<Columns>

<asp:BoundField

DataField="id">

<ItemStyle

Width="100px"

/>

</asp:BoundField>

</Columns>

</asp:GridView>

下面给大家介绍俩种实现思路,第一种为网上常规思路计算高度,第二种是转换思维方式实现方案

注:大家说可能会想到高度给match_parent,wrap_content,这些均实现不了,每个item给固定高度,这样也不行,此问题衍生到了item高度问题

首先回顾一下我们要实现的内容,gradView列表,同一行高度相同,自适应文本最大内容,只限于同一行,说到这里,我们会想到计算同一行每个item高度,选其中最高的那一个maxHeigh,然后将同一行每个item高度都设置成maxHeigh,每行计算每行的,下面给大家分解一下实现方案

首先需要页面绘制完毕,此时才可以获取到所有子view的高度,需要在onLayout执行

第一步获取子view有多少个,获取grieView一行有多少个numColumns,将每一行子view放到一起来计算出最高的高度,方法如下

第一步完毕,此时输出的是每一行最大高度maxHeight高度,下一步我们要用这个高度来设置每一行每个item的高度

依次类推,核心计算规则就是上述展示这样,这样虽然能实现,但是存在问题,项目demo中也有这种样式展示案例,

参考链接 ,但实际实现了此效果,但不理想,存在问题,有兴趣的小伙伴可以研究一下,下面给大家介绍第二种实现思路

我们再来回顾一下我们要实现的内容,gradView列表,同一行高度相同,自适应文本最大内容,只限于同一行,第一种思路已经讲解了如何用高度来计算来实现高度等齐效果,下边我要带大家换一种思维方式来实现,不去计算高度,完全和计算高度不沾边的一种思路,思路明确其实很简单,我们去想,一行中我们要取最大textView的高度,第一种思路是计算出这个高度给其他view,那我们也可以将内容复制给其他TextView,这样也实现了高度统一了,但是有人会说,这样岂不是一行内容都一样了,那我们可以这样,放俩个TextView,一个正常显示,一个占位隐藏,so ~恍然大悟了没有,也就是每一行的view都展示一个文本最长的内容,用占位隐藏来显示,同一行高度每个item都有最大高度的TextView,那每行高度就实现了等齐了,明白了这种思路是不是感觉很简单,但是涉及到一个计算规则问题,下面给大家讲解一下如何来拆分每行最大文本内容

一个adapter本身有一个List集合,我们再拷贝出来一个,每一行放文本最大字数的List,列表展示的时候依次赋值即可

思路拆分一下:遍历真实集合中的文本内容,比对出字节最大的那个,赋值给str,i % spanCount >= spanCount - 1,

集合的下标与每行的行数取余,如果等于每行的行数-1,那代表一行中最后一个,比如如果是 一行有3个,遍历从0开始,那便是0,1,2

2%3=3-1为每行最后一个,依次类推,往mListCopy集合中添加与行数相同数量 的 最大文本字数str,依次类推

i == mListsize() - 1的含义为集合末尾不够整行的文本,这时候就需要处理不够一行的情况,

i集合下标,从0开始,如果与集合数量-1相等,就是到了最后末尾的那一个

根据上述思路,将原集合List和ListCopy集合数量相等,赋值给列表,List正常展示,ListCopy占位隐藏展示,便实现了上述效果

因为在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>;

你获得是计算的实际高度还是有问题的高度,我们知道,scrollview嵌套listview、gridview之类的有问题,所以如果你需要计算recycleview的高度,就需要知道 item的个数与item的高度,然后计算得出

以上就是关于Android开发:GridView的item高度问题全部的内容,包括:Android开发:GridView的item高度问题、怎么修改gridview元素的高度自适应填满gridview-Android开发问答、asp.net如何固定gridview的行高和列宽等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存