Android ListView实现Table行列效果

先来看运行效果:


就两个类,放上去运行就可以看到效果。

TableView.java
Java代码
  1. packagecom.iaiai;
  2. importjava.util.List;
  3. importandroid.content.Context;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Color;
  6. importandroid.graphics.Paint;
  7. importandroid.view.Gravity;
  8. importandroid.view.View;
  9. importandroid.view.ViewGroup;
  10. importandroid.widget.AdapterView;
  11. importandroid.widget.BaseAdapter;
  12. importandroid.widget.LinearLayout;
  13. importandroid.widget.ListView;
  14. importandroid.widget.TextView;
  15. /**
  16. *
  17. *<p>
  18. *Title:MainActivity.java
  19. *</p>
  20. *<p>
  21. *E-Mail:176291935@qq.com
  22. *</p>
  23. *<p>
  24. *QQ:176291935
  25. *</p>
  26. *<p>
  27. *Http:iaiai.iteye.com
  28. *</p>
  29. *<p>
  30. *Createtime:2011-11-9
  31. *</p>
  32. *
  33. *@author丸子
  34. *@version0.0.1
  35. */
  36. publicclassTableViewextendsLinearLayout{
  37. privatestaticLayoutParamsFILL_FILL_LAYOUTPARAMS=newLayoutParams(
  38. LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT,1);
  39. privatestaticLayoutParamsWAP_WAP_LAYOUTPARAMS=newLayoutParams(
  40. LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
  41. privatestaticPaintBLACK_PAINT=newPaint();
  42. privatestaticPaintWHITE_PAINT=newPaint();
  43. static{
  44. WHITE_PAINT.setColor(Color.WHITE);
  45. BLACK_PAINT.setColor(Color.BLACK);
  46. }
  47. privateCAdaptercAdapter;
  48. /**标题空间.*/
  49. privateLinearLayouttitleLayout;
  50. privateString[]title;
  51. privateListViewlistView;
  52. /**数据.*/
  53. privateList<String[]>data;
  54. /**列宽数据.*/
  55. privateint[]itemWidth;
  56. /**当前选中行.*/
  57. privateintselectedPosition=-1;
  58. /**自动列宽列.*/
  59. privateintautoWidthIndex=-1;
  60. privateAdapterView.OnItemClickListeneronItemClickListener;
  61. /**行背景颜色.*/
  62. privateint[]rowsBackgroundColor;
  63. /**选中行背景颜色.*/
  64. privateintselectedBackgroundColor=Color.argb(200,224,243,250);
  65. /**标题背景颜色.*/
  66. privateinttitleBackgroundColor;
  67. /**标题字体颜色.*/
  68. privateinttitleTextColor=Color.argb(255,100,100,100);
  69. /**内容字体颜色.*/
  70. privateintcontentTextColor=Color.argb(255,100,100,100);
  71. /**标题字体大小.*/
  72. privatefloattitleTextSize=0;
  73. /**内容字体大小.*/
  74. privatefloatcontentTextSize=0;
  75. /**
  76. *初始化带标题ListView
  77. *
  78. *@paramcontext
  79. *父级上下文
  80. *@paramtitle
  81. *标题数组
  82. *@paramdata
  83. *内容列表
  84. */
  85. publicTableView(Contextcontext,String[]title,List<String[]>data){
  86. super(context);
  87. this.title=title;
  88. this.data=data;
  89. //设定纵向布局
  90. setOrientation(VERTICAL);
  91. //设定背景为白色
  92. setBackgroundColor(Color.WHITE);
  93. //预先设定好每列的宽
  94. this.itemWidth=newint[title.length];
  95. autoWidthIndex=this.itemWidth.length-1;
  96. //计算列宽
  97. calcColumnWidth();
  98. //添加title位置
  99. titleLayout=newLinearLayout(getContext());
  100. titleLayout.setBackgroundColor(Color.parseColor("#CCCCCC"));
  101. addView(titleLayout);
  102. //绘制标题面板
  103. drawTitleLayout();
  104. //添加listview
  105. listView=newListView(getContext());
  106. listView.setPadding(0,2,0,0);
  107. cAdapter=newCAdapter();
  108. listView.setAdapter(cAdapter);
  109. listView.setCacheColorHint(0);
  110. listView.setLayoutParams(FILL_FILL_LAYOUTPARAMS);
  111. listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
  112. @Override
  113. publicvoidonItemClick(AdapterView<?>parent,Viewview,
  114. intposition,longid){
  115. if(onItemClickListener!=null)
  116. onItemClickListener.onItemClick(parent,view,position,id);
  117. setSelectedPosition(position);
  118. selectedPosition=position;
  119. cAdapter.notifyDataSetChanged();
  120. }
  121. });
  122. addView(listView);
  123. }
  124. /**
  125. *整体有改变时,刷新显示
  126. */
  127. publicvoiddefinedSetChanged(){
  128. calcColumnWidth();
  129. drawTitleLayout();
  130. cAdapter.notifyDataSetChanged();
  131. }
  132. /**
  133. *设置选中时的监听器
  134. *
  135. *@paramonItemClickListener
  136. */
  137. publicvoidsetOnItemClickListener(
  138. AdapterView.OnItemClickListeneronItemClickListener){
  139. this.onItemClickListener=onItemClickListener;
  140. }
  141. /**
  142. *设置行背景颜色,多个颜色可以作为间隔色
  143. *
  144. *@paramcolor
  145. *行背景颜色,可以为多个
  146. */
  147. publicvoidsetItemBackgroundColor(int...color){
  148. rowsBackgroundColor=color;
  149. }
  150. /**
  151. *数据总数
  152. */
  153. publicintgetCount(){
  154. if(data==null)
  155. return0;
  156. returndata.size();
  157. }
  158. /**
  159. *当前选中数据
  160. *
  161. *@paramposition
  162. *@return
  163. */
  164. publicString[]getItem(intposition){
  165. if(data==null)
  166. returnnull;
  167. returndata.get(position);
  168. }
  169. /**
  170. *设置当前选中位置
  171. *
  172. *@return
  173. */
  174. publicvoidsetSelectedPosition(intselectedPosition){
  175. this.selectedPosition=selectedPosition;
  176. }
  177. /**
  178. *当前选中位置
  179. *
  180. *@return
  181. */
  182. publicintgetSelectedPosition(){
  183. returnselectedPosition;
  184. }
  185. /**
  186. *设置被选中时的背景色
  187. *
  188. *@paramcolor
  189. */
  190. publicvoidsetSelectedBackgroundColor(intcolor){
  191. selectedBackgroundColor=color;
  192. }
  193. /**
  194. *设置标题背景色.
  195. *
  196. *@paramcolor
  197. */
  198. publicvoidsetTitleBackgroundColor(intcolor){
  199. titleBackgroundColor=color;
  200. titleLayout.setBackgroundColor(titleBackgroundColor);
  201. }
  202. /**
  203. *设置标题文字颜色
  204. *
  205. *@paramcolor
  206. */
  207. publicvoidsetTitleTextColor(intcolor){
  208. titleTextColor=color;
  209. for(inti=0;i<titleLayout.getChildCount();i++){
  210. ((TextView)titleLayout.getChildAt(i)).setTextColor(titleTextColor);
  211. }
  212. }
  213. /**
  214. *设置内容文字颜色
  215. *
  216. *@paramcolor
  217. */
  218. publicvoidsetContentTextColor(intcolor){
  219. contentTextColor=color;
  220. }
  221. /**
  222. *设置标题字体大小
  223. *
  224. *@paramszie
  225. */
  226. publicvoidsetTitleTextSize(floatszie){
  227. titleTextSize=szie;
  228. }
  229. /**
  230. *设置内容字体大小
  231. *
  232. *@paramszie
  233. */
  234. publicvoidsetContentTextSize(floatszie){
  235. contentTextSize=szie;
  236. }
  237. /**
  238. *
  239. *设定哪列自动列宽从0开始计算
  240. *
  241. *@paramindex
  242. */
  243. publicvoidsetAutoColumnWidth(intindex){
  244. autoWidthIndex=index;
  245. for(inti=0;i<titleLayout.getChildCount();i++){
  246. TextViewtv=((TextView)titleLayout.getChildAt(i));
  247. if(i==autoWidthIndex)
  248. tv.setLayoutParams(FILL_FILL_LAYOUTPARAMS);
  249. else{
  250. tv.setLayoutParams(WAP_WAP_LAYOUTPARAMS);
  251. tv.setWidth(itemWidth[i]);
  252. }
  253. }
  254. }
  255. /**
  256. *绘制标题
  257. */
  258. privatevoiddrawTitleLayout(){
  259. titleLayout.removeAllViews();
  260. for(inti=0;i<title.length;i++){
  261. TextViewtv=newCTextView(titleLayout.getContext());
  262. tv.setTextColor(titleTextColor);
  263. tv.setGravity(Gravity.CENTER);
  264. tv.setText(title[i]);
  265. if(titleTextSize>0){
  266. tv.setTextSize(titleTextSize);
  267. }
  268. tv.setPadding(5,0,5,0);
  269. if(i==autoWidthIndex)
  270. tv.setLayoutParams(TableView.FILL_FILL_LAYOUTPARAMS);
  271. else{
  272. tv.setWidth(itemWidth[i]);
  273. }
  274. titleLayout.addView(tv);
  275. }
  276. }
  277. /**
  278. *计算列宽
  279. *
  280. *@return是否有改动
  281. */
  282. privatebooleancalcColumnWidth(){
  283. booleanresult=false;
  284. floattextSize=newTextView(getContext()).getTextSize();
  285. //计算标题列宽
  286. for(inti=0;i<itemWidth.length;i++){
  287. intw=(int)TableView.GetPixelByText(
  288. (titleTextSize>0)?titleTextSize:textSize,title[i]);
  289. if(itemWidth[i]<w){
  290. itemWidth[i]=w;
  291. result=true;
  292. }
  293. }
  294. //计算内容列宽
  295. if(contentTextSize>0){
  296. textSize=contentTextSize;
  297. }
  298. for(inti=0;i<data.size();i++){
  299. for(intj=0;j<itemWidth.length&&j<data.get(i).length;j++){
  300. intw=(int)TableView
  301. .GetPixelByText(textSize,data.get(i)[j]);
  302. if(itemWidth[j]<w){
  303. itemWidth[j]=w;
  304. result=true;
  305. }
  306. }
  307. }
  308. returnresult;
  309. }
  310. /**
  311. *计算字符串所占像素
  312. *
  313. *@paramtextSize
  314. *字体大小
  315. *@paramtext
  316. *字符串
  317. *@return字符串所占像素
  318. */
  319. privatestaticintGetPixelByText(floattextSize,Stringtext){
  320. PaintmTextPaint=newPaint();
  321. mTextPaint.setTextSize(textSize);//指定字体大小
  322. mTextPaint.setFakeBoldText(true);//粗体
  323. mTextPaint.setAntiAlias(true);//非锯齿效果
  324. return(int)(mTextPaint.measureText(text)+textSize);
  325. }
  326. /**
  327. *主要用的Adapter
  328. *
  329. *@authorCdisk
  330. *
  331. */
  332. classCAdapterextendsBaseAdapter{
  333. /*
  334. *(non-Javadoc)
  335. *
  336. *@seeandroid.widget.Adapter#getCount()
  337. */
  338. @Override
  339. publicintgetCount(){
  340. if(data==null)
  341. return0;
  342. returndata.size();
  343. }
  344. /*
  345. *(non-Javadoc)
  346. *
  347. *@seeandroid.widget.Adapter#getItem(int)
  348. */
  349. @Override
  350. publicObjectgetItem(intposition){
  351. if(data==null)
  352. returnnull;
  353. returndata.get(position);
  354. }
  355. /*
  356. *(non-Javadoc)
  357. *
  358. *@seeandroid.widget.Adapter#getItemId(int)
  359. */
  360. @Override
  361. publiclonggetItemId(intposition){
  362. return0;
  363. }
  364. /*
  365. *(non-Javadoc)
  366. *
  367. *@seeandroid.widget.Adapter#getView(int,android.view.View,
  368. *android.view.ViewGroup)
  369. */
  370. @Override
  371. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  372. //初始化主layout
  373. LinearLayoutcontextLayout=newLinearLayout(
  374. TableView.this.getContext());
  375. String[]dataItem=data.get(position);
  376. if(getSelectedPosition()==position){//为当前选中行
  377. contextLayout.setBackgroundColor(selectedBackgroundColor);
  378. }elseif(rowsBackgroundColor!=null
  379. &&rowsBackgroundColor.length>0){
  380. contextLayout.setBackgroundColor(rowsBackgroundColor[position
  381. %rowsBackgroundColor.length]);
  382. }
  383. for(inti=0;i<title.length;i++){
  384. TextViewtv=newCTextView(contextLayout.getContext());
  385. tv.setTextColor(contentTextColor);
  386. tv.setGravity(Gravity.CENTER);
  387. if(i<dataItem.length){
  388. tv.setText(dataItem[i]);
  389. }
  390. if(i==autoWidthIndex)
  391. tv.setLayoutParams(TableView.FILL_FILL_LAYOUTPARAMS);
  392. else{
  393. tv.setWidth(itemWidth[i]);
  394. }
  395. if(contentTextSize>0){
  396. tv.setTextSize(contentTextSize);
  397. }
  398. contextLayout.addView(tv);
  399. }
  400. returncontextLayout;
  401. }
  402. }
  403. /**
  404. *重写的TextView
  405. *
  406. *@authorCdisk
  407. */
  408. classCTextViewextendsTextView{
  409. @Override
  410. protectedvoidonDraw(Canvascanvas){
  411. super.onDraw(canvas);
  412. //Top
  413. canvas.drawLine(0,0,this.getWidth()-1,0,WHITE_PAINT);
  414. //Left
  415. canvas.drawLine(0,0,0,this.getHeight()-1,WHITE_PAINT);
  416. //Right
  417. canvas.drawLine(this.getWidth()-1,0,this.getWidth()-1,
  418. this.getHeight()-1,BLACK_PAINT);
  419. //Buttom
  420. canvas.drawLine(0,this.getHeight()-1,this.getWidth()-1,
  421. this.getHeight()-1,BLACK_PAINT);
  422. }
  423. publicCTextView(Contextcontext){
  424. super(context);
  425. }
  426. }
  427. }


MainActivity.java
Java代码
  1. packagecom.iaiai;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.graphics.Color;
  6. importandroid.os.Bundle;
  7. importandroid.view.Menu;
  8. importandroid.view.MenuItem;
  9. importandroid.view.View;
  10. importandroid.widget.AdapterView;
  11. /**
  12. *
  13. *<p>
  14. *Title:MainActivity.java
  15. *</p>
  16. *<p>
  17. *E-Mail:176291935@qq.com
  18. *</p>
  19. *<p>
  20. *QQ:176291935
  21. *</p>
  22. *<p>
  23. *Http:iaiai.iteye.com
  24. *</p>
  25. *<p>
  26. *Createtime:2011-11-9
  27. *</p>
  28. *
  29. *@author丸子
  30. *@version0.0.1
  31. */
  32. publicclassMainActivityextendsActivity{
  33. TableViewlistView;
  34. List<String[]>list=newArrayList<String[]>();
  35. @Override
  36. publicvoidonCreate(BundlesavedInstanceState){
  37. super.onCreate(savedInstanceState);
  38. makeData();
  39. String[]title=newString[]{"ID","标题2","标题3","标题4","标题5"};
  40. listView=newTableView(this,title,list);
  41. listView.setTitleTextColor(Color.GREEN);
  42. listView.setTitleBackgroundColor(Color.RED);
  43. //listView.setAutoColumnWidth(3);
  44. //listView.setItemBackgroundColor(Color.GREEN,Color.WHITE);
  45. listView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
  46. @Override
  47. publicvoidonItemClick(AdapterView<?>parent,Viewview,
  48. intposition,longid){
  49. String[]item=listView.getItem(position);
  50. item[2]="12312312312";
  51. listView.definedSetChanged();
  52. }
  53. });
  54. //listView.definedSetChanged();
  55. setContentView(listView);
  56. }
  57. /*
  58. *(non-Javadoc)
  59. *
  60. *@seeandroid.app.Activity#onCreateOptionsMenu(android.view.Menu)
  61. */
  62. @Override
  63. publicbooleanonCreateOptionsMenu(Menumenu){
  64. menu.add(0,0,0,"测试修改选中行");
  65. returntrue;
  66. }
  67. /*
  68. *(non-Javadoc)
  69. *
  70. *@seeandroid.app.Activity#onOptionsItemSelected(android.view.MenuItem)
  71. */
  72. @Override
  73. publicbooleanonOptionsItemSelected(MenuItemitem){
  74. switch(item.getItemId()){
  75. case0:
  76. listView.setSelectedPosition(32);
  77. break;
  78. }
  79. returntrue;
  80. }
  81. privatevoidmakeData(){
  82. list.add(newString[]{"1","数据1.2","数据1.3","数据1.4"});
  83. list.add(newString[]{"2","数据2.2","数据2.3","数据2.4","数据2.5"});
  84. list.add(newString[]{"3","数据3.2","数据3.3","数据3.4"});
  85. list.add(newString[]{"4","数据4.2","数据4.3","数据4.4"});
  86. list.add(newString[]{"5","数据5.2","数据5.3","数据5.4","数据5.5"});
  87. list.add(newString[]{"6","数据6.2","数据6.3","数据6.4"});
  88. list.add(newString[]{"7","数据7.2","数据7.3","数据7.4","数据7.5",
  89. "数据7.6"});
  90. list.add(newString[]{"8","数据8.2","数据8.3","数据8.4"});
  91. list.add(newString[]{"9","数据9.2","数据9.3","数据9.4"});
  92. list.add(newString[]{"10","数据10.2","数据10.3","数据10.4","数据10.5",
  93. "数据10.6","数据10.7"});
  94. list.add(newString[]{"11","数据11.2","数据11.3","数据11.4","数据11.5"});
  95. list.add(newString[]{"12","数据12.2","数据12.3","数据12.4","数据12.5"});
  96. list.add(newString[]{"13","数据13.2","数据13.3","数据13.4","数据13.5"});
  97. list.add(newString[]{"14","数据14.2","数据14.3","数据14.4","数据14.5"});
  98. list.add(newString[]{"15","数据15.2","数据15.3","数据15.4","数据15.5"});
  99. list.add(newString[]{"16","数据16.2","数据16.3","数据16.4","数据16.5"});
  100. list.add(newString[]{"17","数据17.2","数据17.3","数据17.4","数据17.5"});
  101. list.add(newString[]{"18","数据18.2","数据18.3","数据18.4","数据18.5"});
  102. list.add(newString[]{"19","数据19.2","数据19.3","数据19.4","数据19.5"});
  103. list.add(newString[]{"20","数据20.2","数据20.3","数据20.4","数据20.5"});
  104. list.add(newString[]{"21","数据21.2","数据21.3","数据21.4","数据21.5"});
  105. list.add(newString[]{"22","数据22.2","数据22.3","数据22.4","数据22.5"});
  106. list.add(newString[]{"23","数据23.2","数据23.3","数据23.4","数据23.5"});
  107. list.add(newString[]{"24","数据24.2","数据24.3","数据24.4","数据24.5"});
  108. list.add(newString[]{"25","数据25.2","数据25.3","数据25.4","数据25.5"});
  109. list.add(newString[]{"26","数据26.2"});
  110. list.add(newString[]{"27","数据27.2","数据27.3","数据27.4","数据27.5"});
  111. list.add(newString[]{"28","数据28.2","数据28.3","数据28.4","数据28.5"});
  112. list.add(newString[]{"29","数据29.2","数据29.3","数据29.4","数据29.5"});
  113. list.add(newString[]{"30","数据12.2","数据12.3","数据12.4","数据12.5"});
  114. list.add(newString[]{"31","数据13.2","数据13.3","数据13.4","数据13.5"});
  115. list.add(newString[]{"32","数据14.2","数据14.3","数据14.4","数据14.5"});
  116. list.add(newString[]{"33","数据15.2","数据15.3","数据15.4","数据15.5"});
  117. list.add(newString[]{"34","数据16.2","数据16.3","数据16.4","数据16.5"});
  118. list.add(newString[]{"35","数据17.2","数据17.3","数据17.4","数据17.5"});
  119. list.add(newString[]{"36","数据18.2","数据18.3"});
  120. list.add(newString[]{"37","数据19.2","数据19.3","数据19.4","数据19.5"});
  121. list.add(newString[]{"38","数据20.2","数据20.3","数据20.4","数据20.5"});
  122. list.add(newString[]{"39","数据21.2","数据21.3","数据21.4","数据21.5"});
  123. list.add(newString[]{"40","数据22.2","数据22.3","数据22.4","数据22.5"});
  124. list.add(newString[]{"41","数据23.2","数据23.3","数据23.4","数据23.5"});
  125. list.add(newString[]{"42","数据24.2","数据24.3","数据24.4","数据24.5"});
  126. list.add(newString[]{"43","数据25.2","数据25.3","数据25.4","数据25.5"});
  127. list.add(newString[]{"44","数据26.2","数据26.3","数据26.4","数据26.5"});
  128. list.add(newString[]{"45","数据27.2","数据27.3","数据27.4","数据27.5"});
  129. list.add(newString[]{"46","数据28.2","数据28.3","数据28.4","数据28.5"});
  130. list.add(newString[]{"47","数据29.2","数据29.3","数据29.4","数据29.5"});
  131. }
  132. }



我把整个功能写成了一个类,在需要用的时候只需要new出这个类就可以直接使用了
该类目前的所有方法:
Java代码
  1. /**初始化带标题ListView.*/
  2. CListView(Context,String[],List<String[]>)
  3. /**整体有改变时,刷新显示.*/
  4. definedSetChanged()
  5. /**设置选中时的监听器.*/
  6. setOnItemClickListener(OnItemClickListener)
  7. /**设置行背景颜色,多个颜色可以作为间隔色.*/
  8. setItemBackgroundColor(int...)
  9. /**数据总数.*/
  10. getCount()
  11. /**当前选中数据.*/
  12. getItem(int)
  13. /**设置当前选中位置.*/
  14. setSelectedPosition(int)
  15. /**当前选中位置.*/
  16. getSelectedPosition()
  17. /**设置被选中时的背景色.*/
  18. setSelectedBackgroundColor(int)
  19. /**设置标题背景色.*/
  20. setTitleBackgroundColor(int)
  21. /**设置标题文字颜色.*/
  22. setTitleTextColor(int)
  23. /**设置内容文字颜色.*/
  24. setContentTextColor(int)
  25. /**设置标题字体大小.*/
  26. setTitleTextSize(float)
  27. /**设置内容字体大小.*/
  28. setContentTextSize(float)
  29. /**设定哪列自动列宽从0开始计算.*/
  30. setAutoColumnWidth(int)

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. 实例教程十:监听ContentProvider中数据的变化
  5. TabHost 切换带滑动及tab页的数据添加
  6. 转:android笔记之contacts(通讯录)数据库
  7. android sqlite查询数据表的字段与相关属性
  8. Activity 以及 Intent的使用
  9. Android实现沉浸式状态栏

随机推荐

  1. Android与ios区别
  2. Android(安卓)Studio 小技巧合集
  3. Linux下的Android电话管理软件――QtADB(
  4. android 系统重启关机流程分析
  5. 2011.08.12(5)——— android AudioTrack A
  6. Android WebView与服务端交互Demo
  7. 转:android实现发送短信并保存到数据库,同
  8. android如何调用dotnet编写的webservice
  9. android选项卡
  10. gradle使用技巧之全局变量