永发信息网

为什么android gridview只能显示一行数据

答案:1  悬赏:20  手机版
解决时间 2021-02-17 18:17
为什么android gridview只能显示一行数据
最佳答案
因为在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 = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
  super.onMeasure(widthMeasureSpec, expandSpec);
  }
  }
  ListView也同理。
  还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:

  
  public static void setListViewHeightBasedOnChildren(ListView listView) {
  // 获取ListView对应的Adapter
  ListAdapter listAdapter = listView.getAdapter();
  if (listAdapter == null) {
  return;
  }

  int totalHeight = 0;
  for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
  View listItem = listAdapter.getView(i, null, listView);
  listItem.measure(0, 0); // 计算子项View 的宽高
  totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
  }

  ViewGroup.LayoutParams params = listView.getLayoutParams();
  params.height = totalHeight
  + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
  // listView.getDividerHeight()获取子项间分隔符占用的高度
  // params.height最后得到整个ListView完整显示需要的高度
  listView.setLayoutParams(params);
  }
  在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);
  因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(...GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:

  
  public static void setGridViewHeightBasedOnChildren(GridView gridView) {
  // 获取GridView对应的Adapter
  ListAdapter listAdapter = gridView.getAdapter();
  if (listAdapter == null) {
  return;
  }
  int rows;
  int columns = 0;
  int horizontalBorderHeight = 0;
  Class<?> clazz = gridView.getClass();
  try {
  // 利用反射,取得每行显示的个数
  Field column = clazz.getDeclaredField("mRequestedNumColumns");
  column.setAccessible(true);
  columns = (Integer) column.get(gridView);
  // 利用反射,取得横向分割线高度
  Field horizontalSpacing = clazz
  .getDeclaredField("mRequestedHorizontalSpacing");
  horizontalSpacing.setAccessible(true);
  horizontalBorderHeight = (Integer) horizontalSpacing.get(gridView);
  } catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
  }
  // 判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
  if (listAdapter.getCount() % columns > 0) {
  rows = listAdapter.getCount() / columns + 1;
  } else {
  rows = listAdapter.getCount() / columns;
  }
  int totalHeight = 0;
  for (int i = 0; i < rows; i++) { // 只计算每项高度*行数
  View listItem = listAdapter.getView(i, null, gridView);
  listItem.measure(0, 0); // 计算子项View 的宽高
  totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
  }
  ViewGroup.LayoutParams params = gridView.getLayoutParams();
  params.height = totalHeight + horizontalBorderHeight * (rows - 1);// 最后加上分割线总高度
  gridView.setLayoutParams(params);
  }
  这样我们就可以在ListView中添加GridView了。。。
  注:两个SrcollView型的控件可以是:

  <ListView, GridView>;

  <GridView,ListView>;

  <ListView,ListView>;

  <GridView, GridView>;

  <ListView, ScrollView>;

  <ScrollView,ListView>;

  <GridView, ScrollView>;

  <ScrollView, GridView>;

  <ScrollView, ScrollView>;

  ... ...
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
河南建筑职业技术学院毕业补考一般什么时候?
妻子的外公怎么称呼,
很多文字专家指出,欧洲各国媒体发出的报道不
java GWT图形编辑界面
五大洲皮革这个地址在什么地方,我要处理点事
在杭州汽车东站下车后,去下沙怎么坐公交车?
自己定制的linux系统没有apt-get,如何安装ap
至道元宝草书光背现在价值?
都有哪些手机使用高通千兆级LTE呢?
怎样将web项目放到互联网上
(每空2分,共14分)下列是绿色植物在光下制
苏州科技大学空间设计研究院我想知道这个在什
戴尔工作站m4700惠普8570w等等上面带的m4000
合肥成人高考在哪报名?
民昌五金交电商行我想知道这个在什么地方
推荐资讯
谁知到上海浦发银行TM部的邮箱拜托了各位 谢
江苏省有几个省辖市,几个地级市,几个县级市
Mr.cake在什么地方啊,我要过去处理事情
南通农场三大队在什么地方啊,我要过去处理事
电炉丝有额定电压吗
佛山市利而利机械有限公司怎么去啊,有知道地
宏顺电焊工程地址在什么地方,想过去办事
宏福摩托车行在哪里啊,我有事要去这个地方
吸入硅粉多久才会对肺有有危害,具体是多久
当心家装合同中的陷阱
怎么找河南省郑州市中学期末考试成绩
别人要约你看电影,你怎么拒绝,委婉的,怎么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?