android 自定义通用表格类TableView

       最近做项目,用到了表格来展示数据的问题,一开始想到的是用tableLayout来做,但是做到后来发现根本做不下去了,因为你无法控制tableRow中下面的各种View的高度,最后导致它根本就不像一个表格,如果你想借用tableLayout能自动调整列宽,又想能自己自动调整行高,那么这个方案并不适合你,因为tableRow它的高度由tableRow下面的childview来决定,而这些childview是系统设定的WRAPCOTENT,除非你重写tableRow这个类,当然代价肯定是比较大的,因为android暴露给你的方法并不是很方便让你去修改childview的高度,除非你自己动手写一套算法去重写它的测量方法。(当然这个问题也可能是我自己无知造成的,如果有高人可以解决此问题(解决单元格宽和高自动调整的问题),请及时告知,以免我误人子弟,不然罪孽深重啊)。

         下面是我用tableLayout+tableRow解决方案做的表格,如果单元格里面的textView不需要换行,那么请忽略这个问题,因为这个问题只有再textView换行时才会出现,但是textview不换航,那么这个单元格将非常长,体验是非常不佳,特别是某一个单元格的宽度非常宽的时候,那么会非常浪费空间。下面是问题的截图,希望有高人能指正:

android 自定义通用表格类TableView_第1张图片




问题分析:第4列的问题产生的原因是因为第三行的textView造成的。不论你设置strechable或者shrinkAllColumns都无济于事,除非你不设置textView的一行最长字符数,TableLayout的好处是能自动调整列宽,但是tableLayout的tableRow下面的子View的高度你却无权控制,因为系统强制给你指定了,即使你指定了也是in vain的,在做这个表格的思路就是用textView做单元格,表格边框就用一个自定义的shape:rectange来做backgroundDrawable来设定,这样设定之后你的单元格的列宽自动调节才能生效,当然你也可以设置一个Linearlayout为tableRow的子View,给它一个边框背景,不过问题依然存在,原因就是tableRow中的childrenView的高度被系统设置程了wrapContent,这样导致了表格错乱显示的问题。



解决方案:

     网上找了很多解决方案大多都没有注意到这个深层次的问题,那就是textVew多行显示时错乱问题,而且对于表格的控制也不尽如人意,我自己写了2个tableView类,基本上是两个解决方案,先来说说我的第一个方案:

   方案一:ListView方案,特点是效率性能快,缺点是与scrollView的兼容问题,因为我的项目中的table是放在scrollView中的,所以就诞生了我的第二个通用方案,通吃所有布局,当然缺点就是失去了LISTVIEW的效率。那么这个单元格怎么显示出来了?思路是利用listview的边框,然后每一个listView的item中动态加载textView+一根竖线(最后一个cell不加竖线),比如你的表格是M*N的表格,那么就给listview写一个baseadapter,getCount方法中的返回的就是你的数据集的size--M,getView中就动态的new N个textView及N--1条竖线,在这里你甚至可以设置没列的宽度和高度,我在这里抽象了一个TableView类,里面有一个tableFields的内部类,这个内部类用来封装一个二位表格的数据结构,初始化的时候,构造函数public TableFields(String []fieldsTitle,List valueList,int columnWidth[]),第一个字段是你表格的第一行的title字段,第二个参数是表格数据,当然你可以把第一个参数和第二个参数合二为一也是可以的,第三个字段用来指定每一列的宽度,在这里指定了宽度之后,你不需要在其它的地方来重新适配了。

  方案二:思路很简单就是动态加载一个tableRow.tableRow是一个linearlayout,思路与方案一差不多。下面直接放效果图:

android 自定义通用表格类TableView_第2张图片



注意:目前只有方案二做了单元格的地址管理,上图就是方案二的图,这个tableView暴露了一个gettableCell(int  m,int n)的方法获得第m行n列的单元格view的地址,得到这个地址之后你可以做任何你想要的操作,我在这里重新设置了最后一列title字段的颜色,并把第二行第三列的值更改为了一个很长的字符串以显示对于多行字符的换行问题的解决,另外这个view也不存在表格边框显示粗细不均的问题。

说明:对于一般表格我封装的这个TableView效率表现还是差强人意的,如果你有上百行的表格那么就最好选择方案一了,或者自己做一个方案了,对于一般性的需求方案二游刃有余了。




demo下载地址;http://download.csdn.net/detail/hierophantzw/7231481


备注:转载需要注明转载出处即地址,尊重原创,否则保留追究权利。










    

你可能感兴趣的:(mobile,android,开发)