没有现成的方法,只能自己写。很麻烦。
再说就算实现了也很不美观。字少的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的行高和列宽等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)