Android之自制的分页表格控件
16lz
2022-05-01
网页上经常有分页表格的出现,同样的在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
- //查询语句
- sql+="Limit"+TableRowCount+"Offset"+stratIndex;
3、排序方式的改变
[java] view plain copy
- Stringsql="select*from("+SimpleTable.this.sql+
- "Limit"+TableRowCount+"Offset"+pageID*TableRowCount+")tempTableorderby"+
- items[arg2][0];
- if(isDesc[arg2]){
- sql+="asc";
- isDesc[arg2]=false;
- }else{
- sql+="desc";
- isDesc[arg2]=true;
- }
- Log.e("sql",sql);
- toPage(0,sql);
- }
- });
(三)代码:
1、数据项布局文件:items.xml
[xhtml] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutandroid:id="@+id/LinearLayout01"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"android:background="#555555"
- android:layout_height="wrap_content">
- <TextViewandroid:layout_below="@+id/ItemImage"android:text="TextView01"
- android:id="@+id/ItemText"android:bufferType="normal"
- android:singleLine="true"android:background="#000000"
- android:layout_width="fill_parent"android:gravity="center"
- android:layout_margin="1dip"android:layout_gravity="center"
- android:layout_height="wrap_content">
- </TextView>
- </LinearLayout>
2、Activity类:PaginatingTable
[java] view plain copy
- packagecom.myandroid.test;
- importjava.util.HashMap;
- importjava.util.Map;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.view.ViewGroup;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.LinearLayout;
- publicclassPaginatingTableextendsActivity{
- privateLinearLayoutlinearLayout;
- privateSimpleTablesimpleTable;
- privateString[][]items;
- privateStringsql;
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- linearLayout=(LinearLayout)findViewById(R.id.linearLayout);
- //要查询的字段和对应显示的名称
- items=newString[][]{
- {"id","序列"},
- {"name","姓名"},
- {"time","登陆时间"},
- };
- //插入一些数据测试用
- SQLiteUtility.insertSomething(this);
- //查询语句
- Stringsql="select*frommyTable";
- //创建分页表格视图,只需要传入几个参数
- SimpleTablesimpleTable=newSimpleTable(this,items,sql,7);
- linearLayout.addView(simpleTable);
- //addContentView(simpleTable,newViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
- //ViewGroup.LayoutParams.WRAP_CONTENT));
- }
- }
3、分页表格类:SimpleTable
[java] view plain copy
- packagecom.myandroid.test;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.graphics.Color;
- importandroid.graphics.Shader.TileMode;
- importandroid.graphics.Typeface;
- importandroid.util.Log;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.AdapterView.OnItemSelectedListener;
- importandroid.widget.ArrayAdapter;
- importandroid.widget.Button;
- importandroid.widget.GridView;
- importandroid.widget.LinearLayout;
- importandroid.widget.SimpleAdapter;
- importandroid.widget.Spinner;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- importandroid.view.View.OnClickListener;
- publicclassSimpleTableextendsLinearLayoutimplementsOnClickListener,OnItemSelectedListener,
- OnItemClickListener{
- privateContextcontext;//上下文
- privateGridViewgv_titles;//字段视图
- privateGridViewgv_body;//数据视图
- privateLinearLayoutbottomLayout;//视图底部布局
- privateButtonbt_next,bt_pre,bt_first,bt_last;//按钮:下一页、上一页、首页、尾页
- privateTextViewtv_page,tv_count;
- privateSpinnersp_page;//页码下拉框
- privateString[][]items;//[字段][显示的名称]
- privateStringsql;//查询语句
- privateSimpleAdaptertitlesAdatper;//字段视图适配器
- privateSimpleAdapterdatasAdatper;//数据视图适配去
- privateintTableRowCount;//每页显示条数
- privateintpageID;//当前页码
- privateintTotalCount;//总记录条数
- privateintpageCount;//总页数
- privateStringTableName;//表名和查询条件
- privateString[]fields;//字段名称
- privateboolean[]isDesc;//排序方式标记:false-递增排序,true-递减排序
- privateArrayList<HashMap<String,String>>dataList;//数据集合
- publicSimpleTable(Contextcontext){
- super(context);
- this.context=context;
- }
- /**
- *表格视图
- *@paramcontext上下文
- *@paramitems字段名和对应显示名称
- *@paramsqlSQl查询语句
- *@paramdisplayNum每页的最大记录数
- */
- publicSimpleTable(Contextcontext,String[][]items,Stringsql,intTableRowCount){
- super(context);
- this.context=context;
- this.items=items;
- this.sql=sql.replace(";","");
- this.TableRowCount=TableRowCount;
- //排序方式标记:false-递增排序,true-递减排序
- isDesc=newboolean[items.length];
- //当前页码
- pageID=0;
- //表名称和查询条件
- TableName=sql.toLowerCase().substring(sql.toLowerCase().indexOf("from")+5,sql.length()).trim();
- //记录总数
- TotalCount=SQLiteUtility.getCount(context,"selectcount(*)from"+TableName);
- //总页码
- pageCount=TotalCount%TableRowCount==0?TotalCount/TableRowCount-1:TotalCount/TableRowCount;
- //字段名称
- fields=newString[items.length];
- for(inti=0;i<items.length;i++){
- fields[i]=items[i][0];
- }
- setField();//字段视图
- setBody();//数据视图
- setBottomLayout();//底部视图
- setOrientation(LinearLayout.VERTICAL);
- addView(gv_titles);//添加视图
- addView(gv_body);
- addView(bottomLayout);
- }
- /**
- *设置字段视图
- */
- privatevoidsetField(){
- gv_titles=newGridView(context);
- gv_titles.setNumColumns(items.length);
- //字段标题
- ArrayList<HashMap<String,String>>titles=newArrayList<HashMap<String,String>>();
- for(inti=0;i<items.length;i++){
- HashMap<String,String>map=newHashMap<String,String>();
- map.put("title",items[i][1]);
- titles.add(map);
- }
- titlesAdatper=newSimpleAdapter(context,titles,
- R.layout.items,newString[]{"title"},newint[]{R.id.ItemText});
- gv_titles.setAdapter(titlesAdatper);
- //点击字段标题,改变排序方式
- gv_titles.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
- longarg3){
- Stringsql="select*from("+SimpleTable.this.sql+
- "Limit"+TableRowCount+"Offset"+pageID*TableRowCount+")tempTableorderby"+
- items[arg2][0];
- if(isDesc[arg2]){
- sql+="asc";
- isDesc[arg2]=false;
- }else{
- sql+="desc";
- isDesc[arg2]=true;
- }
- Log.e("sql",sql);
- toPage(0,sql);
- }
- });
- }
- /**
- *设置表格数据视图
- */
- privatevoidsetBody(){
- gv_body=newGridView(context);
- gv_body.setNumColumns(items.length);
- toPage(0,this.sql);//转到第一页
- gv_body.setOnItemClickListener(this);//点击数据事件
- }
- /**
- *设置底部翻页视图,
- *由如下组成:首页、上一页、下一页、尾页、页码选择、当期页码提示
- */
- privatevoidsetBottomLayout(){
- //底部容器
- bottomLayout=newLinearLayout(context);
- bottomLayout.setOrientation(LinearLayout.HORIZONTAL);
- bottomLayout.setLayoutParams(newLayoutParams(
- LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
- //翻页按钮
- bt_pre=newButton(context);//上一页
- bt_next=newButton(context);//下一页
- bt_first=newButton(context);//首页
- bt_last=newButton(context);//尾页
- sp_page=newSpinner(context);//页码
- tv_page=newTextView(context);//页码
- //设置文本
- bt_pre.setText("上一页");
- bt_next.setText("下一页");
- bt_first.setText("首页");
- bt_last.setText("尾页");
- tv_page.setText("页码:");
- //设置页码下拉框选项
- List<Integer>list=newArrayList<Integer>();
- for(inti=0;i<=pageCount;i++){
- list.add(i);
- }
- ArrayAdapter<Integer>pageAdapter=newArrayAdapter<Integer>(context,android.R.layout.simple_spinner_item,list);
- sp_page.setAdapter(pageAdapter);
- //设置事件
- sp_page.setOnItemSelectedListener(this);//设置下拉框事件
- bt_first.setOnClickListener(this);
- bt_pre.setOnClickListener(this);
- bt_last.setOnClickListener(this);
- bt_next.setOnClickListener(this);
- //设置文本大小
- bt_first.setTextSize(12);
- bt_pre.setTextSize(12);
- bt_last.setTextSize(12);
- bt_next.setTextSize(12);
- tv_page.setTextSize(12);
- //添加到底部容器
- bottomLayout.addView(bt_first);
- bottomLayout.addView(bt_pre);
- bottomLayout.addView(bt_next);
- bottomLayout.addView(bt_last);
- bottomLayout.addView(tv_page);
- bottomLayout.addView(sp_page);
- }
- //设置显示大小
- publicvoidsetSize(Viewv){
- v.setLayoutParams(newandroid.view.ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
- }
- /**
- *翻页点击事件
- */
- @Override
- publicvoidonClick(Viewv){
- if(v==bt_first){//第一页
- pageID=0;
- }elseif(v==bt_last){//最后一页
- if(pageCount==0){
- return;
- }
- pageID=pageCount;
- }elseif(v==bt_next){//下一页
- if(pageID<pageCount){
- ++pageID;
- }else{
- return;
- }
- }elseif(v==bt_pre){//上一页
- if(pageID<=0){
- return;
- }else{
- --pageID;
- }
- }
- sp_page.setSelection(pageID);
- }
- /**
- *页码下拉框选择事件
- */
- @Override
- publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,intarg2,
- longarg3){
- pageID=arg2;
- Log.e("onItemSelected:","selected");
- toPage(pageID*TableRowCount,this.sql);
- }
- @Override
- publicvoidonNothingSelected(AdapterView<?>arg0){
- //TODOAuto-generatedmethodstub
- }
- /**
- *跳转页面
- *@paramstratIndex开始页码
- *@paramsql查询语句
- */
- publicvoidtoPage(intstratIndex,Stringsql){
- //查询语句
- sql+="Limit"+TableRowCount+"Offset"+stratIndex;
- //获取查询结果集合
- dataList=SQLiteUtility.query2(context,sql,fields);
- //设置适配器
- SimpleAdaptersimpleAdapter=newSimpleAdapter(context,dataList,
- R.layout.items,newString[]{"item"},newint[]{R.id.ItemText});
- gv_body.setAdapter(simpleAdapter);//重新添加适配器
- }
- /**
- *数据项点击事件
- */
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){
- Toast.makeText(context,((HashMap<String,String>)dataList.get(arg2)).get("item"),
- Toast.LENGTH_SHORT).show();
- }
- }
4、SQLite操作类:SQLiteUtility
[java] view plain copy
- packagecom.myandroid.test;
- importjava.text.SimpleDateFormat;
- importjava.util.ArrayList;
- importjava.util.Date;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.app.ActivityGroup;
- importandroid.app.AlertDialog;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.util.Log;
- importandroid.widget.Toast;
- importandroid.database.Cursor;
- importandroid.database.SQLException;
- importandroid.database.sqlite.SQLiteDatabase;
- publicclassSQLiteUtility{
- privatestaticfinalintMODE_PRIVATE=0x0;
- privatestaticfinalStringDATABASE="myDB2";
- privatestaticSQLiteDatabasedb;
- /**
- *插入一些数据
- */
- publicstaticvoidinsertSomething(Contextcontext){
- Cursorcursor;
- intcount=0;
- Stringsql="CREATETABLEmyTable(idintnotnull,"+
- "nametextnotnull,"+
- "timetextnotnull);";
- SimpleDateFormatbartDateFormat=
- newSimpleDateFormat("yyyy-MM-dd-HH:mm");
- Datedate=newDate();
- try{
- db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
- StringsqlCheckExsit="selectcount(*)ascfromSqlite_masterwheretype='table'andname='myTable'";
- cursor=db.rawQuery(sqlCheckExsit,null);
- if(cursor.moveToNext()){
- count=cursor.getInt(0);
- if(count<=0){
- db.execSQL(sql);
- }else{
- db.execSQL("droptablemyTable");
- db.execSQL(sql);
- }
- }
- for(inti=0;i<30;i++){
- StringinsertSql="insertintomyTable("
- +"id,name,time)values('"+i+"','admin','"
- +bartDateFormat.format(date)+"');";
- db.execSQL(insertSql);
- }
- Log.e("insertSql","ok");
- }finally{
- db.close();
- }
- }
- /**
- *查询
- *@paramcontext上下文
- *@paramsqlSQl查询语句
- *@paramfields字段名集合
- *@return查询结果集List<String>类型
- */
- publicstaticList<String>query(Contextcontext,Stringsql,String[]fields){
- List<String>dataList=newArrayList<String>();
- Cursorcursor;
- try{
- db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
- cursor=db.rawQuery(sql,null);
- if(cursor!=null){
- while(cursor.moveToNext()){
- for(inti=0;i<fields.length;i++){
- Stringtemp=cursor.getString(cursor
- .getColumnIndex(fields[i]));
- dataList.add(temp);
- }
- }
- }
- }catch(Exceptione){
- newAlertDialog.Builder(context)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setTitle("数据库连接错误:")
- .setMessage("数据访问异常。")
- .show();
- }finally{
- db.close();
- }
- returndataList;
- }
- /**
- *数据记录总条数
- *@paramcontext上下文
- *@paramsqlSQL查询语句
- *@return记录条数
- */
- publicstaticintgetCount(Contextcontext,Stringsql){
- inttotalCounty=0;
- try{
- db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);
- Cursorcursor=db.rawQuery(sql,null);
- cursor.moveToFirst();
- totalCounty=cursor.getInt(0);
- }catch(Exceptione){
- newAlertDialog.Builder(context)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setTitle("数据库连接错误:").setMessage("数据访问异常。").show();
- }finally{
- db.close();
- }
- returntotalCounty;
- }
- /**
- *查询
- *@paramcontext上下文
- *@paramsqlSQl查询语句
- *@paramfields字段名集合
- *@return查询结果集ArrayList<HashMap<String,String>>类型
- */
- publicstaticArrayList<HashMap<String,String>>query2(Contextcontext,Stringsql,String[]fields){
- ArrayList<HashMap<String,String>>dataList=newArrayList<HashMap<String,String>>();
- Cursorcursor;//游标
- try{
- db=context.openOrCreateDatabase(DATABASE,MODE_PRIVATE,null);//连接数据库
- cursor=db.rawQuery(sql,null);//获取数据集游标
- if(cursor!=null){
- while(cursor.moveToNext()){//游标递增,访问数据集
- for(inti=0;i<fields.length;i++){
- Stringtemp=cursor.getString(cursor//获取对应数据项
- .getColumnIndex(fields[i]));
- HashMap<String,String>map=newHashMap<String,String>();
- map.put("item",temp);
- dataList.add(map);
- }
- }
- }
- }catch(Exceptione){
- newAlertDialog.Builder(context)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setTitle("数据库连接错误:")
- .setMessage("数据访问异常。")
- .show();
- }finally{
- cursor=null;
- db.close();
- }
- returndataList;
- }
- }
更多相关文章
- 打造android ORM框架opendroid(六)——级联查询
- Android(安卓)的上下文菜单: Context Menu
- 【Android】Android中两种常用布局(LinearLayout和RelativeLayout
- android中简单的Handler与Message
- android activity切换动画库SwitchLayout
- android 自定义view之绘制(二)
- Android实例剖析
- android 视图getParent,getChildAt
- Android(安卓)的上下文菜单: Context Menu