网页上经常有分页表格的出现,同样的在Android上也可以实现。Android本身并没有直接提供表格这个控件,一般可以用GridView来实现比较简单,但是每个数据显示的长宽会一样。当然,也可以用ListView来实现,这个灵活定义每个数据显示的长宽。还有一种,是采用布局TableLayout来实现等等。这里用GridView,来实现一个。下载路径:http://download.csdn.net/source/3275713

它有几个特点:

1、实现分页;

2、简便的翻页按钮设置;

3、点击顶部字段名称会改变排序方式;

4、使用方便,只需几个参数。

(一)截图

(二)关键部分:

1、视图架构:

该分页视图控件,由三部分组成:顶部:字段视图:gv_titles,主体:数据视图:gv_body,底部:分页按钮视图:bottomlayout。

2、SQl分页查询语句:

[java] view plain copy
  1. //查询语句
  2. sql+="Limit"+TableRowCount+"Offset"+stratIndex;

3、排序方式的改变

[java] view plain copy
  1. Stringsql="select*from("+SimpleTable.this.sql+
  2. "Limit"+TableRowCount+"Offset"+pageID*TableRowCount+")tempTableorderby"+
  3. items[arg2][0];
  4. if(isDesc[arg2]){
  5. sql+="asc";
  6. isDesc[arg2]=false;
  7. }else{
  8. sql+="desc";
  9. isDesc[arg2]=true;
  10. }
  11. Log.e("sql",sql);
  12. toPage(0,sql);
  13. }
  14. });

(三)代码:

1、数据项布局文件:items.xml

[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutandroid:id="@+id/LinearLayout01"
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"android:background="#555555"
  5. android:layout_height="wrap_content">
  6. <TextViewandroid:layout_below="@+id/ItemImage"android:text="TextView01"
  7. android:id="@+id/ItemText"android:bufferType="normal"
  8. android:singleLine="true"android:background="#000000"
  9. android:layout_width="fill_parent"android:gravity="center"
  10. android:layout_margin="1dip"android:layout_gravity="center"
  11. android:layout_height="wrap_content">
  12. </TextView>
  13. </LinearLayout>

2、Activity类:PaginatingTable

[java] view plain copy
  1. packagecom.myandroid.test;
  2. importjava.util.HashMap;
  3. importjava.util.Map;
  4. importandroid.app.Activity;
  5. importandroid.os.Bundle;
  6. importandroid.view.ViewGroup;
  7. importandroid.view.ViewGroup.LayoutParams;
  8. importandroid.widget.LinearLayout;
  9. publicclassPaginatingTableextendsActivity{
  10. privateLinearLayoutlinearLayout;
  11. privateSimpleTablesimpleTable;
  12. privateString[][]items;
  13. privateStringsql;
  14. /**Calledwhentheactivityisfirstcreated.*/
  15. @Override
  16. publicvoidonCreate(BundlesavedInstanceState){
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.main);
  19. linearLayout=(LinearLayout)findViewById(R.id.linearLayout);
  20. //要查询的字段和对应显示的名称
  21. items=newString[][]{
  22. {"id","序列"},
  23. {"name","姓名"},
  24. {"time","登陆时间"},
  25. };
  26. //插入一些数据测试用
  27. SQLiteUtility.insertSomething(this);
  28. //查询语句
  29. Stringsql="select*frommyTable";
  30. //创建分页表格视图,只需要传入几个参数
  31. SimpleTablesimpleTable=newSimpleTable(this,items,sql,7);
  32. linearLayout.addView(simpleTable);
  33. //addContentView(simpleTable,newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
  34. //ViewGroup.LayoutParams.WRAP_CONTENT));
  35. }
  36. }

3、分页表格类:SimpleTable

[java] view plain copy
  1. packagecom.myandroid.test;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importjava.util.List;
  5. importjava.util.Map;
  6. importandroid.content.Context;
  7. importandroid.database.Cursor;
  8. importandroid.graphics.Color;
  9. importandroid.graphics.Shader.TileMode;
  10. importandroid.graphics.Typeface;
  11. importandroid.util.Log;
  12. importandroid.view.Gravity;
  13. importandroid.view.View;
  14. importandroid.view.ViewGroup.LayoutParams;
  15. importandroid.widget.AdapterView;
  16. importandroid.widget.AdapterView.OnItemClickListener;
  17. importandroid.widget.AdapterView.OnItemSelectedListener;
  18. importandroid.widget.ArrayAdapter;
  19. importandroid.widget.Button;
  20. importandroid.widget.GridView;
  21. importandroid.widget.LinearLayout;
  22. importandroid.widget.SimpleAdapter;
  23. importandroid.widget.Spinner;
  24. importandroid.widget.TextView;
  25. importandroid.widget.Toast;
  26. importandroid.view.View.OnClickListener;
  27. publicclassSimpleTableextendsLinearLayoutimplementsOnClickListener,OnItemSelectedListener,
  28. OnItemClickListener{
  29. privateContextcontext;//上下文
  30. privateGridViewgv_titles;//字段视图
  31. privateGridViewgv_body;//数据视图
  32. privateLinearLayoutbottomLayout;//视图底部布局
  33. privateButtonbt_next,bt_pre,bt_first,bt_last;//按钮:下一页、上一页、首页、尾页
  34. privateTextViewtv_page,tv_count;
  35. privateSpinnersp_page;//页码下拉框
  36. privateString[][]items;//[字段][显示的名称]
  37. privateStringsql;//查询语句
  38. privateSimpleAdaptertitlesAdatper;//字段视图适配器
  39. privateSimpleAdapterdatasAdatper;//数据视图适配去
  40. privateintTableRowCount;//每页显示条数
  41. privateintpageID;//当前页码
  42. privateintTotalCount;//总记录条数
  43. privateintpageCount;//总页数
  44. privateStringTableName;//表名和查询条件
  45. privateString[]fields;//字段名称
  46. privateboolean[]isDesc;//排序方式标记:false-递增排序,true-递减排序
  47. privateArrayList<HashMap<String,String>>dataList;//数据集合
  48. publicSimpleTable(Contextcontext){
  49. super(context);
  50. this.context=context;
  51. }
  52. /**
  53. *表格视图
  54. *@paramcontext上下文
  55. *@paramitems字段名和对应显示名称
  56. *@paramsqlSQl查询语句
  57. *@paramdisplayNum每页的最大记录数
  58. */
  59. publicSimpleTable(Contextcontext,String[][]items,Stringsql,intTableRowCount){
  60. super(context);
  61. this.context=context;
  62. this.items=items;
  63. this.sql=sql.replace(";","");
  64. this.TableRowCount=TableRowCount;
  65. //排序方式标记:false-递增排序,true-递减排序
  66. isDesc=newboolean[items.length];
  67. //当前页码
  68. pageID=0;
  69. //表名称和查询条件
  70. TableName=sql.toLowerCase().substring(sql.toLowerCase().indexOf("from")+5,sql.length()).trim();
  71. //记录总数
  72. TotalCount=SQLiteUtility.getCount(context,"selectcount(*)from"+TableName);
  73. //总页码
  74. pageCount=TotalCount%TableRowCount==0?TotalCount/TableRowCount-1:TotalCount/TableRowCount;
  75. //字段名称
  76. fields=newString[items.length];
  77. for(inti=0;i<items.length;i++){
  78. fields[i]=items[i][0];
  79. }
  80. setField();//字段视图
  81. setBody();//数据视图
  82. setBottomLayout();//底部视图
  83. setOrientation(LinearLayout.VERTICAL);
  84. addView(gv_titles);//添加视图
  85. addView(gv_body);
  86. addView(bottomLayout);
  87. }
  88. /**
  89. *设置字段视图
  90. */
  91. privatevoidsetField(){
  92. gv_titles=newGridView(context);
  93. gv_titles.setNumColumns(items.length);
  94. //字段标题
  95. ArrayList<HashMap<String,String>>titles=newArrayList<HashMap<String,String>>();
  96. for(inti=0;i<items.length;i++){
  97. HashMap<String,String>map=newHashMap<String,String>();
  98. map.put("title",items[i][1]);
  99. titles.add(map);
  100. }
  101. titlesAdatper=newSimpleAdapter(context,titles,
  102. R.layout.items,newString[]{"title"},newint[]{R.id.ItemText});
  103. gv_titles.setAdapter(titlesAdatper);
  104. //点击字段标题,改变排序方式
  105. gv_titles.setOnItemClickListener(newOnItemClickListener(){
  106. @Override
  107. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  108. longarg3){
  109. Stringsql="select*from("+SimpleTable.this.sql+
  110. "Limit"+TableRowCount+"Offset"+pageID*TableRowCount+")tempTableorderby"+
  111. items[arg2][0];
  112. if(isDesc[arg2]){
  113. sql+="asc";
  114. isDesc[arg2]=false;
  115. }else{
  116. sql+="desc";
  117. isDesc[arg2]=true;
  118. }
  119. Log.e("sql",sql);
  120. toPage(0,sql);
  121. }
  122. });
  123. }
  124. /**
  125. *设置表格数据视图
  126. */
  127. privatevoidsetBody(){
  128. gv_body=newGridView(context);
  129. gv_body.setNumColumns(items.length);
  130. toPage(0,this.sql);//转到第一页
  131. gv_body.setOnItemClickListener(this);//点击数据事件
  132. }
  133. /**
  134. *设置底部翻页视图,
  135. *由如下组成:首页、上一页、下一页、尾页、页码选择、当期页码提示
  136. */
  137. privatevoidsetBottomLayout(){
  138. //底部容器
  139. bottomLayout=newLinearLayout(context);
  140. bottomLayout.setOrientation(LinearLayout.HORIZONTAL);
  141. bottomLayout.setLayoutParams(newLayoutParams(
  142. LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
  143. //翻页按钮
  144. bt_pre=newButton(context);//上一页
  145. bt_next=newButton(context);//下一页
  146. bt_first=newButton(context);//首页
  147. bt_last=newButton(context);//尾页
  148. sp_page=newSpinner(context);//页码
  149. tv_page=newTextView(context);//页码
  150. //设置文本
  151. bt_pre.setText("上一页");
  152. bt_next.setText("下一页");
  153. bt_first.setText("首页");
  154. bt_last.setText("尾页");
  155. tv_page.setText("页码:");
  156. //设置页码下拉框选项
  157. List<Integer>list=newArrayList<Integer>();
  158. for(inti=0;i<=pageCount;i++){
  159. list.add(i);
  160. }
  161. ArrayAdapter<Integer>pageAdapter=newArrayAdapter<Integer>(context,android.R.layout.simple_spinner_item,list);
  162. sp_page.setAdapter(pageAdapter);
  163. //设置事件
  164. sp_page.setOnItemSelectedListener(this);//设置下拉框事件
  165. bt_first.setOnClickListener(this);
  166. bt_pre.setOnClickListener(this);
  167. bt_last.setOnClickListener(this);
  168. bt_next.setOnClickListener(this);
  169. //设置文本大小
  170. bt_first.setTextSize(12);
  171. bt_pre.setTextSize(12);
  172. bt_last.setTextSize(12);
  173. bt_next.setTextSize(12);
  174. tv_page.setTextSize(12);
  175. //添加到底部容器
  176. bottomLayout.addView(bt_first);
  177. bottomLayout.addView(bt_pre);
  178. bottomLayout.addView(bt_next);
  179. bottomLayout.addView(bt_last);
  180. bottomLayout.addView(tv_page);
  181. bottomLayout.addView(sp_page);
  182. }
  183. //设置显示大小
  184. publicvoidsetSize(Viewv){
  185. v.setLayoutParams(newandroid.view.ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
  186. }
  187. /**
  188. *翻页点击事件
  189. */
  190. @Override
  191. publicvoidonClick(Viewv){
  192. if(v==bt_first){//第一页
  193. pageID=0;
  194. }elseif(v==bt_last){//最后一页
  195. if(pageCount==0){
  196. return;
  197. }
  198. pageID=pageCount;
  199. }elseif(v==bt_next){//下一页
  200. if(pageID<pageCount){
  201. ++pageID;
  202. }else{
  203. return;
  204. }
  205. }elseif(v==bt_pre){//上一页
  206. if(pageID<=0){
  207. return;
  208. }else{
  209. --pageID;
  210. }
  211. }
  212. sp_page.setSelection(pageID);
  213. }
  214. /**
  215. *页码下拉框选择事件
  216. */
  217. @Override
  218. publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,intarg2,
  219. longarg3){
  220. pageID=arg2;
  221. Log.e("onItemSelected:","selected");
  222. toPage(pageID*TableRowCount,this.sql);
  223. }
  224. @Override
  225. publicvoidonNothingSelected(AdapterView<?>arg0){
  226. //TODOAuto-generatedmethodstub
  227. }
  228. /**
  229. *跳转页面
  230. *@paramstratIndex开始页码
  231. *@paramsql查询语句
  232. */
  233. publicvoidtoPage(intstratIndex,Stringsql){
  234. //查询语句
  235. sql+="Limit"+TableRowCount+"Offset"+stratIndex;
  236. //获取查询结果集合
  237. dataList=SQLiteUtility.query2(context,sql,fields);
  238. //设置适配器
  239. SimpleAdaptersimpleAdapter=newSimpleAdapter(context,dataList,
  240. R.layout.items,newString[]{"item"},newint[]{R.id.ItemText});
  241. gv_body.setAdapter(simpleAdapter);//重新添加适配器
  242. }
  243. /**
  244. *数据项点击事件
  245. */
  246. @Override
  247. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){
  248. Toast.makeText(context,((HashMap<String,String>)dataList.get(arg2)).get("item"),
  249. Toast.LENGTH_SHORT).show();
  250. }
  251. }

4、SQLite操作类:SQLiteUtility

[java] view plain copy
  1. packagecom.myandroid.test;
  2. importjava.text.SimpleDateFormat;
  3. importjava.util.ArrayList;
  4. importjava.util.Date;
  5. importjava.util.HashMap;
  6. importjava.util.List;
  7. importjava.util.Map;
  8. importandroid.app.ActivityGroup;
  9. importandroid.app.AlertDialog;
  10. importandroid.content.Context;
  11. importandroid.database.Cursor;
  12. importandroid.database.sqlite.SQLiteDatabase;
  13. importandroid.util.Log;
  14. importandroid.widget.Toast;
  15. importandroid.database.Cursor;
  16. importandroid.database.SQLException;
  17. importandroid.database.sqlite.SQLiteDatabase;
  18. publicclassSQLiteUtility{
  19. privatestaticfinalintMODE_PRIVATE=0x0;
  20. privatestaticfinalStringDATABASE="myDB2";
  21. privatestaticSQLiteDatabasedb;
  22. /**
  23. *插入一些数据
  24. */
  25. publicstaticvoidinsertSomething(Contextcontext){
  26. Cursorcursor;
  27. intcount=0;
  28. Stringsql="CREATETABLEmyTable(idintnotnull,"+
  29. "nametextnotnull,"+
  30. "timetextnotnull);";
  31. SimpleDateFormatbartDateFormat=
  32. newSimpleDateFormat("yyyy-MM-dd-HH:mm");
  33. Datedate=newDate();
  34. try{
  35. db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
  36. StringsqlCheckExsit="selectcount(*)ascfromSqlite_masterwheretype='table'andname='myTable'";
  37. cursor=db.rawQuery(sqlCheckExsit,null);
  38. if(cursor.moveToNext()){
  39. count=cursor.getInt(0);
  40. if(count<=0){
  41. db.execSQL(sql);
  42. }else{
  43. db.execSQL("droptablemyTable");
  44. db.execSQL(sql);
  45. }
  46. }
  47. for(inti=0;i<30;i++){
  48. StringinsertSql="insertintomyTable("
  49. +"id,name,time)values('"+i+"','admin','"
  50. +bartDateFormat.format(date)+"');";
  51. db.execSQL(insertSql);
  52. }
  53. Log.e("insertSql","ok");
  54. }finally{
  55. db.close();
  56. }
  57. }
  58. /**
  59. *查询
  60. *@paramcontext上下文
  61. *@paramsqlSQl查询语句
  62. *@paramfields字段名集合
  63. *@return查询结果集List<String>类型
  64. */
  65. publicstaticList<String>query(Contextcontext,Stringsql,String[]fields){
  66. List<String>dataList=newArrayList<String>();
  67. Cursorcursor;
  68. try{
  69. db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
  70. cursor=db.rawQuery(sql,null);
  71. if(cursor!=null){
  72. while(cursor.moveToNext()){
  73. for(inti=0;i<fields.length;i++){
  74. Stringtemp=cursor.getString(cursor
  75. .getColumnIndex(fields[i]));
  76. dataList.add(temp);
  77. }
  78. }
  79. }
  80. }catch(Exceptione){
  81. newAlertDialog.Builder(context)
  82. .setIcon(android.R.drawable.ic_dialog_alert)
  83. .setTitle("数据库连接错误:")
  84. .setMessage("数据访问异常。")
  85. .show();
  86. }finally{
  87. db.close();
  88. }
  89. returndataList;
  90. }
  91. /**
  92. *数据记录总条数
  93. *@paramcontext上下文
  94. *@paramsqlSQL查询语句
  95. *@return记录条数
  96. */
  97. publicstaticintgetCount(Contextcontext,Stringsql){
  98. inttotalCounty=0;
  99. try{
  100. db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
  101. Cursorcursor=db.rawQuery(sql,null);
  102. cursor.moveToFirst();
  103. totalCounty=cursor.getInt(0);
  104. }catch(Exceptione){
  105. newAlertDialog.Builder(context)
  106. .setIcon(android.R.drawable.ic_dialog_alert)
  107. .setTitle("数据库连接错误:").setMessage("数据访问异常。").show();
  108. }finally{
  109. db.close();
  110. }
  111. returntotalCounty;
  112. }
  113. /**
  114. *查询
  115. *@paramcontext上下文
  116. *@paramsqlSQl查询语句
  117. *@paramfields字段名集合
  118. *@return查询结果集ArrayList<HashMap<String,String>>类型
  119. */
  120. publicstaticArrayList<HashMap<String,String>>query2(Contextcontext,Stringsql,String[]fields){
  121. ArrayList<HashMap<String,String>>dataList=newArrayList<HashMap<String,String>>();
  122. Cursorcursor;//游标
  123. try{
  124. db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);//连接数据库
  125. cursor=db.rawQuery(sql,null);//获取数据集游标
  126. if(cursor!=null){
  127. while(cursor.moveToNext()){//游标递增,访问数据集
  128. for(inti=0;i<fields.length;i++){
  129. Stringtemp=cursor.getString(cursor//获取对应数据项
  130. .getColumnIndex(fields[i]));
  131. HashMap<String,String>map=newHashMap<String,String>();
  132. map.put("item",temp);
  133. dataList.add(map);
  134. }
  135. }
  136. }
  137. }catch(Exceptione){
  138. newAlertDialog.Builder(context)
  139. .setIcon(android.R.drawable.ic_dialog_alert)
  140. .setTitle("数据库连接错误:")
  141. .setMessage("数据访问异常。")
  142. .show();
  143. }finally{
  144. cursor=null;
  145. db.close();
  146. }
  147. returndataList;
  148. }
  149. }


转自http://blog.csdn.net/kkfdsa132/article/details/6416114

更多相关文章

  1. 打造android ORM框架opendroid(六)——级联查询
  2. Android(安卓)的上下文菜单: Context Menu
  3. 【Android】Android中两种常用布局(LinearLayout和RelativeLayout
  4. android中简单的Handler与Message
  5. android activity切换动画库SwitchLayout
  6. android 自定义view之绘制(二)
  7. Android实例剖析
  8. android 视图getParent,getChildAt
  9. Android(安卓)的上下文菜单: Context Menu

随机推荐

  1. Activity 属性设置大全
  2. 解决gradle下载慢,下载失败的办法
  3. android创建漂亮对话框
  4. Android 4.0 开发者指南(27) —— Resour
  5. Android+JNI调用–文件操作
  6. Android(安卓)requires compiler complia
  7. Android 监听开机广播打开APP
  8. 【转】android编译系统的makefile文件And
  9. Android之路——第一个Android小程序(Andr
  10. Android多点触控揭秘