Android提高之ListView实现自适应表格的方法
程序员文章站
2022-05-16 12:28:13
前面有文章介绍了使用gridview实现表格的方法,本文就来说说如何用listview实现自适应的表格。gridview比listview更容易实现自适应的表格,但是gri...
前面有文章介绍了使用gridview实现表格的方法,本文就来说说如何用listview实现自适应的表格。gridview比listview更容易实现自适应的表格,但是gridview每个格单元的大小固定,而listview实现的表格可以自定义每个格单元的大小,但因此实现自适应表格也会复杂些(主要由于格单元大小不一)。此外,gridview实现的表格可以定位在具体某个格单元,而listview实现的表格则只能定位在表格行。因此还是那句老话:根据具体的使用环境而选择gridview 或者 listview实现表格。
先来看看本文程序运行的效果图,如下图所示:
本文实现的listview表格,可以每个格单元大小不一,文本(textview)或图片(imageview)做格单元的数据,不需要预先定义xml实现样式(自适应的根本目标)。由于listview置于horizontalscrollview中,因此对于列比较多/列数据比较长的数据表也能很好地适应其宽度。
main.xml源码如下:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <horizontalscrollview android:id="@+id/horizontalscrollview01" android:layout_height="fill_parent" android:layout_width="fill_parent"> <listview android:id="@+id/listview01" android:layout_height="wrap_content" android:layout_width="wrap_content"></listview> </horizontalscrollview> </linearlayout>
主类testmylistview.java的源码如下:
package com.testmylistview; import java.util.arraylist; import com.testmylistview.tableadapter.tablecell; import com.testmylistview.tableadapter.tablerow; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.listview; import android.widget.linearlayout.layoutparams; import android.widget.toast; /** * @author hellogv */ public class testmylistview extends activity { /** called when the activity is first created. */ listview lv; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); this.settitle("listview自适应实现表格---hellogv"); lv = (listview) this.findviewbyid(r.id.listview01); arraylist<tablerow> table = new arraylist<tablerow>(); tablecell[] titles = new tablecell[5];// 每行5个单元 int width = this.getwindowmanager().getdefaultdisplay().getwidth()/titles.length; // 定义标题 for (int i = 0; i < titles.length; i++) { titles[i] = new tablecell("标题" + string.valueof(i), width + 8 * i, layoutparams.fill_parent, tablecell.string); } table.add(new tablerow(titles)); // 每行的数据 tablecell[] cells = new tablecell[5];// 每行5个单元 for (int i = 0; i < cells.length - 1; i++) { cells[i] = new tablecell("no." + string.valueof(i), titles[i].width, layoutparams.fill_parent, tablecell.string); } cells[cells.length - 1] = new tablecell(r.drawable.icon, titles[cells.length - 1].width, layoutparams.wrap_content, tablecell.image); // 把表格的行添加到表格 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()); } class itemclickevent implements adapterview.onitemclicklistener { @override public void onitemclick(adapterview<?> arg0, view arg1, int arg2, long arg3) { toast.maketext(testmylistview.this, "选中第"+string.valueof(arg2)+"行", 500).show(); } } }
listview自适应实现table的类tableadapter.java代码如下:
此处需要注意:tablecell是格单元的类,tablerow是表格行的类,tablerowview是实现表格行的组件。实现步骤:tablecell --> tablerow(tablerowview)-->listview
package com.testmylistview; import java.util.list; import android.content.context; import android.graphics.color; import android.view.gravity; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.imageview; import android.widget.linearlayout; import android.widget.textview; public class tableadapter extends baseadapter { private context context; private list<tablerow> table; public tableadapter(context context, list<tablerow> table) { this.context = context; this.table = table; } @override public int getcount() { return table.size(); } @override public long getitemid(int position) { return position; } public tablerow getitem(int position) { return table.get(position); } public view getview(int position, view convertview, viewgroup parent) { tablerow tablerow = table.get(position); return new tablerowview(this.context, tablerow); } /** * tablerowview 实现表格行的样式 * @author hellogv */ class tablerowview extends linearlayout { public tablerowview(context context, tablerow tablerow) { super(context); 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项目开发有所帮助。
推荐阅读
-
Android之Intent附加数据的两种实现方法
-
Android之ScrollView嵌套ListView和GridView冲突的解决方法
-
Android笔记之:在ScrollView中嵌套ListView的方法
-
Android开发笔记之:在ImageView上绘制圆环的实现方法
-
Android实现ListView异步加载图片的方法
-
Android中ListView下拉刷新的实现方法实例分析
-
Android通讯录开发之删除功能的实现方法
-
Android编程实现ListView内容无限循环显示的方法
-
Android开发之ListView列表刷新和加载更多实现方法
-
Android实现读取SD卡下所有TXT文件名并用listView显示出来的方法