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

本文来自http://blog.csdn.net/hellogv/,引用必须注明出处!

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

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

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

main.xml源码如下:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <HorizontalScrollViewandroid:id="@+id/HorizontalScrollView01"
  6. android:layout_height="fill_parent"android:layout_width="fill_parent">
  7. <ListViewandroid:id="@+id/ListView01"android:layout_height="wrap_content"
  8. android:layout_width="wrap_content"></ListView>
  9. </HorizontalScrollView>
  10. </LinearLayout>

主类testMyListView.java的源码如下:

  1. packagecom.testMyListView;
  2. importjava.util.ArrayList;
  3. importcom.testMyListView.TableAdapter.TableCell;
  4. importcom.testMyListView.TableAdapter.TableRow;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.view.View;
  8. importandroid.widget.AdapterView;
  9. importandroid.widget.ListView;
  10. importandroid.widget.LinearLayout.LayoutParams;
  11. importandroid.widget.Toast;
  12. /**
  13. *@authorhellogv
  14. */
  15. publicclasstestMyListViewextendsActivity{
  16. /**Calledwhentheactivityisfirstcreated.*/
  17. ListViewlv;
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. this.setTitle("ListView自适应实现表格---hellogv");
  23. lv=(ListView)this.findViewById(R.id.ListView01);
  24. ArrayList<TableRow>table=newArrayList<TableRow>();
  25. TableCell[]titles=newTableCell[5];//每行5个单元
  26. intwidth=this.getWindowManager().getDefaultDisplay().getWidth()/titles.length;
  27. //定义标题
  28. for(inti=0;i<titles.length;i++){
  29. titles[i]=newTableCell("标题"+String.valueOf(i),
  30. width+8*i,
  31. LayoutParams.FILL_PARENT,
  32. TableCell.STRING);
  33. }
  34. table.add(newTableRow(titles));
  35. //每行的数据
  36. TableCell[]cells=newTableCell[5];//每行5个单元
  37. for(inti=0;i<cells.length-1;i++){
  38. cells[i]=newTableCell("No."+String.valueOf(i),
  39. titles[i].width,
  40. LayoutParams.FILL_PARENT,
  41. TableCell.STRING);
  42. }
  43. cells[cells.length-1]=newTableCell(R.drawable.icon,
  44. titles[cells.length-1].width,
  45. LayoutParams.WRAP_CONTENT,
  46. TableCell.IMAGE);
  47. //把表格的行添加到表格
  48. for(inti=0;i<12;i++)
  49. table.add(newTableRow(cells));
  50. TableAdaptertableAdapter=newTableAdapter(this,table);
  51. lv.setAdapter(tableAdapter);
  52. lv.setOnItemClickListener(newItemClickEvent());
  53. }
  54. classItemClickEventimplementsAdapterView.OnItemClickListener{
  55. @Override
  56. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  57. longarg3){
  58. Toast.makeText(testMyListView.this,"选中第"+String.valueOf(arg2)+"行",500).show();
  59. }
  60. }
  61. }

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

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

  1. packagecom.testMyListView;
  2. importjava.util.List;
  3. importandroid.content.Context;
  4. importandroid.graphics.Color;
  5. importandroid.view.Gravity;
  6. importandroid.view.View;
  7. importandroid.view.ViewGroup;
  8. importandroid.widget.BaseAdapter;
  9. importandroid.widget.ImageView;
  10. importandroid.widget.LinearLayout;
  11. importandroid.widget.TextView;
  12. publicclassTableAdapterextendsBaseAdapter{
  13. privateContextcontext;
  14. privateList<TableRow>table;
  15. publicTableAdapter(Contextcontext,List<TableRow>table){
  16. this.context=context;
  17. this.table=table;
  18. }
  19. @Override
  20. publicintgetCount(){
  21. returntable.size();
  22. }
  23. @Override
  24. publiclonggetItemId(intposition){
  25. returnposition;
  26. }
  27. publicTableRowgetItem(intposition){
  28. returntable.get(position);
  29. }
  30. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  31. TableRowtableRow=table.get(position);
  32. returnnewTableRowView(this.context,tableRow);
  33. }
  34. /**
  35. *TableRowView实现表格行的样式
  36. *@authorhellogv
  37. */
  38. classTableRowViewextendsLinearLayout{
  39. publicTableRowView(Contextcontext,TableRowtableRow){
  40. super(context);
  41. this.setOrientation(LinearLayout.HORIZONTAL);
  42. for(inti=0;i<tableRow.getSize();i++){//逐个格单元添加到行
  43. TableCelltableCell=tableRow.getCellValue(i);
  44. LinearLayout.LayoutParamslayoutParams=newLinearLayout.LayoutParams(
  45. tableCell.width,tableCell.height);//按照格单元指定的大小设置空间
  46. layoutParams.setMargins(0,0,1,1);//预留空隙制造边框
  47. if(tableCell.type==TableCell.STRING){//如果格单元是文本内容
  48. TextViewtextCell=newTextView(context);
  49. textCell.setLines(1);
  50. textCell.setGravity(Gravity.CENTER);
  51. textCell.setBackgroundColor(Color.BLACK);//背景黑色
  52. textCell.setText(String.valueOf(tableCell.value));
  53. addView(textCell,layoutParams);
  54. }elseif(tableCell.type==TableCell.IMAGE){//如果格单元是图像内容
  55. ImageViewimgCell=newImageView(context);
  56. imgCell.setBackgroundColor(Color.BLACK);//背景黑色
  57. imgCell.setImageResource((Integer)tableCell.value);
  58. addView(imgCell,layoutParams);
  59. }
  60. }
  61. this.setBackgroundColor(Color.WHITE);//背景白色,利用空隙来实现边框
  62. }
  63. }
  64. /**
  65. *TableRow实现表格的行
  66. *@authorhellogv
  67. */
  68. staticpublicclassTableRow{
  69. privateTableCell[]cell;
  70. publicTableRow(TableCell[]cell){
  71. this.cell=cell;
  72. }
  73. publicintgetSize(){
  74. returncell.length;
  75. }
  76. publicTableCellgetCellValue(intindex){
  77. if(index>=cell.length)
  78. returnnull;
  79. returncell[index];
  80. }
  81. }
  82. /**
  83. *TableCell实现表格的格单元
  84. *@authorhellogv
  85. */
  86. staticpublicclassTableCell{
  87. staticpublicfinalintSTRING=0;
  88. staticpublicfinalintIMAGE=1;
  89. publicObjectvalue;
  90. publicintwidth;
  91. publicintheight;
  92. privateinttype;
  93. publicTableCell(Objectvalue,intwidth,intheight,inttype){
  94. this.value=value;
  95. this.width=width;
  96. this.height=height;
  97. this.type=type;
  98. }
  99. }
  100. }

你可能感兴趣的:(ListView)