昨天用到GridView,但是遇到几个问题,就是GridView默认的item其实大小是一致的,但是我们经常会遇到item大小不同,系统默认会留白的问题,很头疼!如下图这样的:

就会造成,右图所示,左右大小不一致,中间还留了一块,给人的感觉太差了!!
那如何保证GridView自适应且看起来更美观呢? 达到这样的效果呢??
度娘搜索了,google了,还是没找到好的方法!!但是在一篇blog里得到了 一个思路,就是把GridView对象传进到adapter 里面,然后去动态设置item的height。
这样做就行:
贴出部分关键代码:
private GridView gv;
public AtypeAdapter(GridView gv, Context context, List<AtypeEntity> list) {
this.gv = gv;
this.context = context;
this.data = list;
}
GridView对象传到对应的adapter里面, 网上很多人人也说了,得到GridVeiw的总的height,然后除以总共的Rows就可以设置所有的行的item高度一致了。但是对于GridView来说,adapter数据都没绑定,怎么可能得到高度呢? 还有一点是,咱们的GridView的每个item的高度是不确定的,就算你算出了GridView的总高度,然后跟item的rows做除法,得到的每行的高度,得到的效果也不是想要的,因为有的item会很大,会比平局高度还大,那会显示不全,有的item会比较小,比平均高度还小很多,会导致留白很大!效果很差!!
我的adapter的每一个item 里面包含了三个textview,textview的内容文字的长度是不固定的,所以按照平均值来写死每个item的高度,是不理想的,也是不行的。
那怎么办? 这么写:
传入的GridView之后,
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if (convertView == null) {
holder = new Holder();
convertView = View.inflate((Activity) this.context,
R.layout.atype_adpter, null);
holder.atype_serial_num = (TextView) convertView
.findViewById(R.id.atype_serial_num);
holder.atype_name = (TextView) convertView
.findViewById(R.id.atype_name);
holder.atype_kusercode = (TextView) convertView
.findViewById(R.id.atype_code);
convertView.setTag(holder);
// 绑定listener监听器,检测convertview的height
holder.update();
} else {
holder = (Holder) convertView.getTag();
}
holder.atype_serial_num.setText((position + 1) + "");
holder.atype_name.setText(data.get(position).getAfullname());
holder.atype_kusercode.setText(data.get(position).getAusercode());
// 绑定tag
holder.atype_kusercode.setTag(position);
// 绑定当前的item,也就是convertview
holder.atype_name.setTag(convertView);
return convertView;
}
public class Holder {
public TextView atype_serial_num;
public TextView atype_name;
public TextView atype_kusercode;
public void update() {
// 精确计算GridView的item高度
atype_kusercode.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
public void onGlobalLayout() {
int position = (Integer) atype_kusercode.getTag();
// 这里是保证同一行的item高度是相同的!!也就是同一行是齐整的 height相等
if (position > 0 && position % 2 == 1) {
View v = (View) atype_name.getTag();
int height = v.getHeight();
View view = gv.getChildAt(position - 1);
int lastheight = view.getHeight();
// 得到同一行的最后一个item和前一个item想比较,把谁的height大,就把两者中 // height小的item的高度设定为height较大的item的高度一致,也就是保证同一 // 行高度相等即可
if (height > lastheight) {
view.setLayoutParams(new GridView.LayoutParams(
GridView.LayoutParams.FILL_PARENT,
height));
} else if (height < lastheight) {
v.setLayoutParams(new GridView.LayoutParams(
GridView.LayoutParams.FILL_PARENT,
lastheight));
}
}
}
});
}
}
这样设定以后,adpter的同一行的item的height会相同,保证了GridView同一行的height自适应相同,美观且舒服!!
谢谢!
<!--192.168.100.33-->
顶
1
踩
0
分享到:
相关推荐
简书地址:https://www.jianshu.com/p/d0f4547f7760 俩种实现方案 1、recyclerView 实现 GridView模式同一行,使其高度平齐,自动适应高度最大item 2、GridView 实现同一行,使其高度平齐,自动适应高度最大item
在某些场景下,用户可能需要展示高度不相等的item,以满足个性化或复杂布局的需求。在这种情况下,我们就需要对默认的GridView进行自定义来实现这一功能。本文将详细介绍如何在ListView中添加高度不相等的GridView。...
ASPxGridview高度设置,但是想表格能够自适应高度的话,不知从那里下手,官方代码及使用经验。
在传统的GridView中,每个item通常被设置为相同大小的正方形,但有时我们可能希望item的尺寸根据内部内容的宽高比例来变化,这就需要矩形自适应布局。例如,显示图片或不同宽高的卡片时,这种布局就显得尤为重要。 ...
标题 "advBandedGridView自动换行自适应高度" 指的是在使用advBandedGridView时,如何实现单元格内容自动换行以及根据内容调整行的高度以适应显示。这涉及到两个关键功能:自动换行和自动行高调整。 自动换行功能是...
这可能涉及到重新计算每个Item的布局参数,如宽度和高度,并调用`requestLayout()`来通知系统视图需要更新布局。 3. **动画效果**: 为了让放大缩小过程更加平滑,我们可以使用ObjectAnimator或ValueAnimator来...
在某些场景下,我们可能希望ASPxGridView的高度能够自适应,始终保持填充整个浏览器窗口,以便提供最佳的用户体验。本文将详细讲解如何实现这一目标,具体步骤如下: 1. **设置客户别名**: 首先,我们需要为ASPx...
"Txt、Exl自适应导入GridView"这个主题聚焦于如何高效地将TXT文本文件和Excel电子表格数据导入到GridView控件中进行显示。GridView是一种常见的数据展示组件,尤其在ASP.NET中广泛使用,它允许用户以网格形式查看和...
由于GridView会复用item,所以需要确保在`convertView`不为null时正确地复用视图,避免内存泄漏和不必要的绘制。同时,为了提高滚动流畅性,可以使用`ViewHolder`模式减少查找视图的时间开销。 在提供的...
下面我们将详细探讨如何实现"Gridview 每个item为正方形且有间隔颜色"这一功能。 首先,我们需要创建一个自定义的Adapter,继承自BaseAdapter。这个Adapter将负责填充数据到GridView的每个单元格,并处理每个item的...
例如,如果一个item需要合并两行,那么在创建该item的视图后,接下来的一行应该被跳过,不添加任何视图。 此外,为了使流式布局能够正确地处理item的合并,我们还需要考虑一些额外的细节。例如,可能需要为...
GridView的每个单元格称为“item”,可以用来展示各种类型的数据,如图片、文字等。本篇文章将详细探讨如何实现GridView中item的不同样式,以及如何在Android应用中灵活运用。 一、GridView的基本使用 首先,我们...
在实际应用中,我们可能需要根据用户操作动态地添加或删除GridView中的item。本篇文章将详细讲解如何实现"gridview动态添加item"的功能,以及在实现过程中可能会遇到的问题和解决方案。 首先,我们需要在XML布局...
这个"GridView-Item-Rotate"项目是关于如何在GridView的每个Item(单元格)上实现卡牌翻转效果的一个实例。这样的效果可以增加用户交互性和应用的趣味性,常见于各种应用的卡片式设计中,如社交应用、游戏或者信息...
实现GridView的横向滑动,默认为纵向滑动,主要目标实现GridView中两个或多个相邻item的合并效果,满足项目的UI设计,同时解决了item选中放大被其他item遮挡的问题;用法简单,一目了然,可供参考
在这个实现中,GridView不再局限于传统的网格布局,而是允许item根据内容的大小自适应高度,形成类似Pinterest的视觉效果。实现这一特性可能需要用到自定义的布局管理器,它需要处理不同高度的item并保持网格的整体...
这个“gridView item一个一个出来,一个一个消失动画”的主题聚焦于如何为GridView中的每个项目添加入场和退场动画,使应用的用户体验更加生动有趣。下面我们将深入探讨相关知识点。 首先,我们了解下GridView的...
在某些场景下,我们可能需要让GridView中的某些项占据多行空间,这就是所谓的"GridView跨行"。这个"GridView跨行demo"是为了展示如何在GridView中实现这种效果。 在GridView中实现跨行功能,主要涉及到`GridView`的...
Gridview合并多列内容相同的行,相同的行内容相同实际合并,可以实际多列合并
本文将深入探讨如何使用RecyclerView实现横向的ListView、GridView以及类似合并item的GridView,同时解决GridView中item动画放大时被其他item遮盖的问题。 首先,RecyclerView的核心在于它的LayoutManager,这是...