HardBirch

Android提高第十五篇之ListView自适应实现表格

时间:10-12-14 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:83 点击: 24,668 次

       上次介绍了使用GridView实现表格,这次就说说如何用ListView实现自适应的表格。GridView比ListView更容易实现自适应的表格,但是GridView每个格单元的大小固定,而ListView实现的表格可以自定义每个格单元的大小,但因此实现自适应表格也会复杂些(格单元大小不一)。另外,GridView实现的表格可以定位在具体某个格单元,而ListView实现的表格则只能定位在表格行。因此还是那句老话:根据具体的使用环境而选择GridView 或者 ListView实现表格。

先贴出本文程序运行的效果图:

本文实现的ListView表格,可以每个格单元大小不一,文本(TextView)或图片(ImageView)做格单元的数据,不需要预先定义XML实现样式(自适应的根本目标)。由于ListView置于HorizontalScrollView中,因此对于列比较多/列数据比较长的数据表也能很好地适应其宽度。

main.xml源码如下:











主类testMyListView.java的源码如下:





























































ListView自适应实现Table的类TableAdapter.java代码如下:

PS:TableCell是格单元的类,TableRow是表格行的类,TableRowView是实现表格行的组件。实现步骤:TableCell --> TableRow(TableRowView)-->ListView








































this.setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < tableRow.getSize(); i++) {//逐个格单元添加到行
TableCell tableCell = tableRow.getCellValue(i);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
tableCell.width, tableCell.height);//按照格单元指定的大小设置空间
layoutParams.setMargins(0, 0, 1, 1);//预留空隙制造边框
if (tableCell.type == TableCell.STRING) {//如果格单元是文本内容
TextView textCell = new TextView(context);
textCell.setLines(1);
textCell.setGravity(Gravity.CENTER);
textCell.setBackgroundColor(Color.BLACK);//背景黑色
textCell.setText(String.valueOf(tableCell.value));
addView(textCell, layoutParams);
} else if (tableCell.type == TableCell.IMAGE) {//如果格单元是图像内容
ImageView imgCell = new ImageView(context);
imgCell.setBackgroundColor(Color.BLACK);//背景黑色
imgCell.setImageResource((Integer) tableCell.value);
addView(imgCell, layoutParams);
}
}
this.setBackgroundColor(Color.WHITE);//背景白色,利用空隙来实现边框
}
}
/**
* TableRow 实现表格的行
* @author hellogv
*/
static public class TableRow {
private TableCell[] cell;
public TableRow(TableCell[] cell) {
this.cell = cell;
}
public int getSize() {
return cell.length;
}
public TableCell getCellValue(int index) {
if (index >= cell.length)
return null;
return cell[index];
}
}
/**
* TableCell 实现表格的格单元
* @author hellogv
*/
static public class TableCell {
static public final int STRING = 0;
static public final int IMAGE = 1;
public Object value;
public int width;
public int height;
private int type;
public TableCell(Object value, int width, int height, int type) {
this.value = value;
this.width = width;
this.height = height;
this.type = type;
}
}
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第十五篇之ListView自适应实现表格

Android提高第十五篇之ListView自适应实现表格:目前有83 条留言

  1. 0楼
    kf156:

    [e01]更新的挺快的

    2010-12-14 11:51 [回复]
  2. 0楼
    hmc1985:

    [e01]不错!

    2010-12-14 12:24 [回复]
  3. 0楼
    gzwangyu:

    很想知道你的gif的动画使用什么生成的??[e07]

    2010-12-14 13:47 [回复]
  4. [e01][e06]

    2010-12-14 15:29 [回复]
  5. [e02][e03][e01][e04][e06][e10]

    2010-12-15 09:39 [回复]
  6. 0楼
    tqwboy:

    博主一如既往的牛[e03]

    2010-12-15 10:48 [回复]
  7. 学习了,谢谢[e01]

    2010-12-15 14:52 [回复]
  8. 0楼
    jay_007:

    [e01]

    2010-12-16 11:00 [回复]
  9. 回复 gzwangyu:有个软件叫随时随地gif

    2010-12-16 15:03 [回复]
  10. 0楼
    ucshng:

    支持不错:黔城热线 http://www.gz0859.com 黔西南综合信息网,免费发布各类招聘信息,商家黄页 希望大家支持一下,,谢谢

    2010-12-16 15:47 [回复]
  11. 顶。。。。。。。[e03]

    2010-12-16 20:17 [回复]
  12. 我靠,太有用了,必须得顶[e01]

    2010-12-17 08:57 [回复]
  13. 0楼
    jjclqj:

    更新的挺快的

    2010-12-17 10:53 [回复]
  14. [e01][e01][e01][e01][e01][e01]

    2010-12-17 13:49 [回复]
  15. [e01] 强!

    2010-12-17 16:22 [回复]
  16. 好,太强大了。

    2010-12-18 12:22 [回复]
  17. 学习中

    2010-12-18 12:55 [回复]
  18. 学习中

    2010-12-18 21:41 [回复]
  19. 楼主辛苦了、

    2010-12-18 23:32 [回复]
  20. 谢谢分享

    2010-12-22 13:28 [回复]
  21. 0楼
    wilber46:

    受教了

    2010-12-27 13:46 [回复]
  22. 0楼
    yanghuaixi:

    [e01][e06][e10][e10]

    2010-12-29 15:32 [回复]
  23. [e01][e01][e01]

    2010-12-30 16:25 [回复]
  24. 0楼
    asewq:

    [e03]
    老大,这正是我需要的效果,直接拿来用了哈,多谢多谢!

    2011-03-22 17:37 [回复]
  25. 0楼
    kongyanmin:

    [e01]

    2011-04-06 12:48 [回复]
  26. 0楼
    kongyanmin:

    你的表格移动时候标题也跟着移动了,但是呢按理说标题应该是始终在最上边显示的,

    2011-04-07 09:48 [回复]
  27. 请问一下 自己添加不同的数据到表格里面去怎么添加啊 ?

    2011-04-10 14:42 [回复]
  28. 0楼
    dlut_labor:

    3.点击 EditText 后会出现软键盘 然后正常情况下 点击返回键 应该是软键盘消失 EditText 中出现你刚填写的字符 但是实际情况是 点击完后 EditText 内容为空了
    在这里请教下

    2011-04-13 12:47 [回复]
  29. 0楼
    dlut_labor:

    2.我想得到每一个EditText的内容 应该怎么处理呢? 我的做法是申请EditText动态数组 每一个都有监听 但是我发现getView()被重复调用了很多遍 最后还是没有解决

    2011-04-13 12:47 [回复]
  30. 0楼
    dlut_labor:

    我根据你的例子做了一个类似的表格 只不过我把最后的Image类型换成了EditText 出现了一下几个问题:
    1.ListView 的 OnItemClickListener 不好用了,换成Button也是一 样 这个应该是加入可点击控件后出现的结果吧?

    2011-04-13 12:47 [回复]
  31. 0楼
    hellogv:

    回复 dlut_labor:
    能用GridView就尽量用GridView做表格

    2011-04-13 19:30 [回复]
  32. 0楼
    over1400:

    支持一下,正好用到[e01]

    2011-05-06 10:29 [回复]
  33. 0楼
    over1400:

    HorizontalScrollView不可以和ListView同时用,因为ListView有自己的滚动条设置。最重要的是,如果在需要显示很大的list的情况下,两者同时用则会使ListView在一些重要的优化上失效。

    2011-05-06 11:21 [回复]
  34. 0楼
    over1400:

    参见HorizontalScrollView的API说明:
    http://www.cnblogs.com/over140/archive/2011/01/10/1931629.html

    2011-05-06 11:22 [回复]
  35. 请教一下,TableRow tableRow = table.get(position); return new TableRowView(this.context, tableRow); 这里都是new的,会很卡呀

    2011-07-04 10:08 [回复]
  36. 0楼
    vchaoho:

    很有用,支持

    2011-07-29 14:04 [回复]
  37. 0楼
    agods:

    如果做横版的表格该怎么调整呢?

    2011-08-17 10:00 [回复]
  38. 0楼
    hellogv:

    [reply]agods[/reply]
    什么叫做横版表格?

    2011-08-17 18:37 [回复]
  39. 0楼
    agods:

    [reply]hellogv[/reply]
    现在的格式是属于竖版的,横版的就是数据是以行为单元的。每一行的第一列的内容是行名,后面的是数据,例如:
    日期:123 456 789
    营业额:123 456 789

    2011-08-17 18:46 [回复]
  40. 0楼
    hellogv:

    [reply]agods[/reply]
    晕,你把表格的title放在左边第一列就行了…..只是方向不同,有什么难的?

    2011-08-24 18:46 [回复]
  41. 0楼
    lvsedejiyi:

    请教你一个问题:listview 和arrayadapter 的关系,再说具体点就是listview 和数组的关系。如果一个数组有1000项,一个屏幕只能显示7个listview ,那每一个数据和那七个listview是否是一一对应关系。是否够能举例说明一下

    2011-08-31 09:00 [回复]
  42. 0楼
    hellogv:

    [reply]lvsedejiyi[/reply]
    每一个数组只能对应一个ListView,有多少个ListView就要有多少个数组

    2011-08-31 09:18 [回复]
  43. 不错,不错,受教了

    2011-09-01 09:36 [回复]
  44. 0楼
    haojunming:

    问一下,listview中得item怎么实现点击不变颜色,谢谢啊

    2011-09-01 13:51 [回复]
  45. 不错的android开发论坛: http://bbs.androidjy.com

    2011-09-14 13:08 [回复]
  46. 好帖子,顶

    2011-09-17 11:18 [回复]
  47. 0楼
    hellogv:

    [reply]haojunming[/reply]
    selector的Drawable设为透明色的Drawable就行了

    2011-09-25 17:07 [回复]
  48. 请问 // 把表格的行添加到表格
    for (int i = 0; i < 12; i++)
    table.add(new TableRow(cells));
    TableAdapter tableAdapter = new TableAdapter(this, table);
    lv.setAdapter(tableAdapter);
    lv.setOnItemClickListener(new ItemClickEvent());
    }

    这里是把上面的一行复制到下面去,每行都是一样的,我现在要用每行不一样该怎么办啊!!

    2011-10-03 20:46 [回复]
  49. 0楼
    hellogv:

    [reply]baozhuifeng[/reply]
    修改adapter的数据啊。。。

    2011-10-04 07:37 [回复]
  50. 0楼
    zhcx678:

    我想请教下,如果我想要每个格子都有一个滑动条或者点击放大的话,该怎么做呢? 因为格子里的数据比较多,如果全部显示,看起来不美观。 谢谢了……

    2011-10-27 20:14 [回复]
  51. 0楼
    hellogv:

    [reply]zhcx678[/reply]
    这样做很复杂,每一行都是HScrollView+GridView

    2011-10-28 09:07 [回复]
  52. 0楼
    zhcx678:

    [reply]hellogv[/reply]
    能否具体说说 TableRowView 里该怎么写呢?

    2011-10-28 09:40 [回复]
  53. 0楼
    hellogv:

    [reply]zhcx678[/reply]
    TableRowView 如果超过屏幕宽度,还是要用HScrollView

    2011-10-28 13:46 [回复]
  54. 楼主是否可以发个源码到我的邮箱 我把这个放到工程里面怎么都报错 现在急需做一个这样的应用 拜托啦

    2011-11-02 12:36 [回复]
  55. [reply]pengmengjiao[/reply]
    我的邮箱是 pengmengjiao520@163.com

    2011-11-02 13:22 [回复]
  56. 请教楼主问题: listView 竖版显示, 多条加载如何做? 举例:
    titile param1 param2 param3 param4。。。。。
    用户:用户1 用户2 用户3 用户4
    年龄: 18 20 19 21
    生日:09.01 09.02 09.01 09.21
    可以继续增加到param5 。。 param6…….param10….param100

    2011-11-17 15:55 [回复]
  57. 0楼
    hellogv:

    [reply]wanghf_java[/reply]
    这个建议用Gallery来做,会简单些

    2011-11-17 17:58 [回复]
  58. [reply]hellogv[/reply]
    谢谢 hellogv 。

    2011-11-18 11:39 [回复]
  59. 0楼
    lc_880627:

    终于找到了,谢谢了!

    2011-12-06 16:19 [回复]
  60. 0楼
    sdgszy2005:

    楼主您好 我在每行的开头加了一个checkbox(代码:
    CheckBox checkBox = new CheckBox(context);
    checkBox.setChecked((Boolean) tableCell.value);),但是无法获取它的当前状态,请问我该如何在TableAdapter中修改代码呀!我入门不久,您能详细的说明一下吗?谢谢

    2012-01-03 18:26 [回复]
  61. 0楼
    hellogv:

    [reply]sdgszy2005[/reply]
    自己实现base adapter,在base adapter用自己的方法来获取选中了哪个checkbox

    2012-01-04 09:21 [回复]
  62. 0楼
    sdgszy2005:

    没弄出来,不过还是非常感谢!

    2012-01-06 14:48 [回复]
  63. 0楼
    hellogv:

    [reply]sdgszy2005[/reply]
    多做android一段开发,就会发现,其实很多GridView和ListView,真用系统自带的很少,基本都是自己继承BaseAdapter来弄得,BaseAdapter是必须掌握的

    2012-01-11 11:41 [回复]
  64. 0楼
    billyhhzh:

    请问,我现在要在这个表上做动态更新数据;
    如何做?

    我自己试了用handle来处理,
    TableCell[] cells = table.get(msg.arg1).getCell();
    cells[msg.arg2].SetText((String) msg.obj);
    但没有效果

    2012-01-18 17:03 [回复]
  65. 0楼
    QPYMAC:

    你好,如果我要在标题4这一列加4个Button该怎么办?

    2012-01-20 15:43 [回复]
  66. 您好,我列中的值的宽度超出了列设置的宽度后,后面的不显示了,求解决自动换行的问题?急,谢谢哟

    2012-02-15 14:50 [回复]
  67. 显示的数据都是一样的,我想要不一样的怎么办啊?

    2012-03-16 09:58 [回复]
  68. 0楼
    hellogv:

    [reply]zhaojianand[/reply]
    在 new TableCell 这里修改

    2012-03-16 23:13 [回复]
  69. 0楼
    mmloveabb:

    Adapter的值怎么改啊。。。我弄了半天还是不能把每列的值弄成不一样的。。。

    2012-04-10 18:04 [回复]
  70. 0楼
    mmcq_:

    开心开心、、

    2012-04-11 10:22 [回复]
  71. 谢谢楼主分享

    2012-05-05 23:26 [回复]
  72. 0楼
    qyfighting:

    我就按上面的程序copy的,但是提示:进程意外停止,请重试!
    我是个初学者,弄不明白了!麻烦您帮解决一下!非常感谢! 或者把源代码发给我!daeryou126@126.com谢谢了!
    (用的版本是android2.1)

    2012-05-07 19:22 [回复]
  73. 0楼
    testguess:

    可不可以发这篇源码到我邮箱里?邮箱915308885@qq.com谢谢!

    2012-05-30 01:03 [回复]
  74. 0楼
    zzpxingfu:

    hellogv 首先感谢分享:
    另外,我想在每一行的行首添加一个checkbox 行尾添加一个下拉框。
    请问:
    1、我可以得到页面中所有的checkbox吗?
    2、如果第一点可行,我可以根据该checkbox,来获取该行中下拉框对象吗?
    最好付一下代码,万分感谢!

    2012-05-31 16:21 [回复]
  75. 0楼
    hellogv:

    [reply]zzpxingfu[/reply]
    只要自己实现Adapter就可以实现了

    2012-06-04 09:18 [回复]
  76. 0楼
    bogongjie:

    你好,使用你的這種方式,實現了點擊時listview的item高亮,就是在TableAdapter中使用TextCell.setbackground 和textcell.textcolor來使整行都亮,功能是實現了,現在是點擊listview以外的區域時候,不能把選中項變回來,能推荐個方法麼?謝謝!

    2012-07-17 17:33 [回复]
  77. 0楼
    gycxgycx:

    楼主你好,请问这个里面的数据可以从数据库读进来吗?急求

    2012-07-18 09:38 [回复]
  78. 0楼
    gycxgycx:

    楼主你好,我做了从数据库里读数据,但是你cells是一维数组,所以每行的数据是一样的,这个有没有办法改?

    2012-07-18 14:14 [回复]
  79. 0楼
    bogongjie:

    LZ你好,這個表格在上下移動的時候,表格的標題那一個item可以不讓它動麼?

    2012-07-18 19:33 [回复]
  80. 0楼
    hellogv:

    [reply]bogongjie[/reply]
    可以,标题放在另外一个布局

    2012-07-22 11:29 [回复]
  81. 0楼
    hellogv:

    [reply]gycxgycx[/reply]
    ………..你把数据读取出来再一个个填充

    2012-07-22 11:30 [回复]
  82. 0楼
    viqddd2010:

    学习楼主的代码

    2012-08-16 14:58 [回复]
  83. 博主 实在太强了,真的学习了。看了你的效果令我非常兴奋,所以回帖了

    2012-09-06 16:53 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐