设为首页 收藏本站
查看: 2092|回复: 0

[经验分享] Android提高第九篇之SQLite分页表格

[复制链接]

尚未签到

发表于 2016-12-1 09:26:40 | 显示全部楼层 |阅读模式
本文来自http://blog.csdn.net/hellogv/,引用必须注明出处!

上次讲的Android上的SQLite分页读取,只用文本框显示数据而已,这次就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据。先来看看本文程序运行的动画:

DSC0000.gif

这个SQL分页表格控件主要分为“表格区”和“分页栏”这两部分,这两部分都是基于GridView实现的。网上介绍Android上实现表格的DEMO一般都用ListView。ListView与GridView对比,ListView最大的优势是格单元的大小可以自定义,可以某单元长某单元短,但是难于实现自适应数据表的结构;而GridView最大的优势就是自适应数据表的结构,但是格单元统一大小。。。对于数据表结构多变的情况,建议使用GridView实现表格。

本文实现的SQL分页表格控件有以下特点:

1.自适应数据表结构,但是格单元统一大小;

2.支持分页;

3.“表格区”有按键事件回调处理,“分页栏”有分页切换事件回调处理。

本文程序代码较多,可以到这里下载整个工程的源码:http://www.rayfile.com/files/72e78b68-f2e5-11df-8469-0015c55db73d/

items.xml的代码如下,它是“表格区”和“分页栏”的格单元实现:


viewplainprint?


  • <?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>

main.xml的代码如下:


viewplainprint?


  • <?xmlversion="1.0"encoding="utf-8"?>
  • <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  • android:orientation="vertical"android:layout_width="fill_parent"
  • android:layout_height="fill_parent"android:id="@+id/MainLinearLayout">
  • <Buttonandroid:layout_height="wrap_content"
  • android:layout_width="fill_parent"android:id="@+id/btnCreateDB"
  • android:text="创建数据库"></Button>
  • <Buttonandroid:layout_height="wrap_content"
  • android:layout_width="fill_parent"android:text="插入一串实验数据"android:id="@+id/btnInsertRec"></Button>
  • <Buttonandroid:layout_height="wrap_content"android:id="@+id/btnClose"
  • android:text="关闭数据库"android:layout_width="fill_parent"></Button>
  • </LinearLayout>

演示程序testSQLite.java的源码:


viewplainprint?


  • packagecom.testSQLite;
  • importandroid.app.Activity;
  • importandroid.database.Cursor;
  • importandroid.database.SQLException;
  • importandroid.database.sqlite.SQLiteDatabase;
  • importandroid.os.Bundle;
  • importandroid.util.Log;
  • importandroid.view.View;
  • importandroid.widget.Button;
  • importandroid.widget.LinearLayout;
  • importandroid.widget.Toast;
  • publicclasstestSQLiteextendsActivity{
  • GVTabletable;
  • ButtonbtnCreateDB,btnInsert,btnClose;
  • SQLiteDatabasedb;
  • intid;//添加记录时的id累加标记,必须全局
  • privatestaticfinalStringTABLE_NAME="stu";
  • privatestaticfinalStringID="id";
  • privatestaticfinalStringNAME="name";
  • privatestaticfinalStringPHONE="phone";
  • privatestaticfinalStringADDRESS="address";
  • privatestaticfinalStringAGE="age";

  • @Override
  • publicvoidonCreate(BundlesavedInstanceState){
  • super.onCreate(savedInstanceState);
  • setContentView(R.layout.main);
  • btnCreateDB=(Button)this.findViewById(R.id.btnCreateDB);
  • btnCreateDB.setOnClickListener(newClickEvent());
  • btnInsert=(Button)this.findViewById(R.id.btnInsertRec);
  • btnInsert.setOnClickListener(newClickEvent());
  • btnClose=(Button)this.findViewById(R.id.btnClose);
  • btnClose.setOnClickListener(newClickEvent());
  • table=newGVTable(this);
  • table.gvSetTableRowCount(8);//设置每个分页的ROW总数
  • LinearLayoutly=(LinearLayout)findViewById(R.id.MainLinearLayout);
  • table.setTableOnClickListener(newGVTable.OnTableClickListener(){
  • @Override
  • publicvoidonTableClickListener(intx,inty,Cursorc){
  • c.moveToPosition(y);
  • Stringstr=c.getString(x)+"位置:("+String.valueOf(x)+","+String.valueOf(y)+")";
  • Toast.makeText(testSQLite.this,str,1000).show();
  • }
  • });
  • table.setOnPageSwitchListener(newGVTable.OnPageSwitchListener(){

  • @Override
  • publicvoidonPageSwitchListener(intpageID,intpageCount){
  • Stringstr="共有"+String.valueOf(pageCount)+
  • "当前第"+String.valueOf(pageID)+"页";
  • Toast.makeText(testSQLite.this,str,1000).show();
  • }
  • });

  • ly.addView(table);
  • }
  • classClickEventimplementsView.OnClickListener{
  • @Override
  • publicvoidonClick(Viewv){
  • if(v==btnCreateDB){
  • CreateDB();
  • }elseif(v==btnInsert){
  • InsertRecord(16);//插入16条记录
  • table.gvUpdatePageBar("selectcount(*)from"+TABLE_NAME,db);
  • table.gvReadyTable("select*from"+TABLE_NAME,db);
  • }elseif(v==btnClose){
  • table.gvRemoveAll();
  • db.close();

  • }
  • }
  • }

  • /**
  • *在内存创建数据库和数据表
  • */
  • voidCreateDB(){
  • //在内存创建数据库
  • db=SQLiteDatabase.create(null);
  • Log.e("DBPath",db.getPath());
  • Stringamount=String.valueOf(databaseList().length);
  • Log.e("DBamount",amount);
  • //创建数据表
  • Stringsql="CREATETABLE"+TABLE_NAME+"("+
  • ID+"textnotnull,"+NAME+"textnotnull,"+
  • ADDRESS+"textnotnull,"+PHONE+"textnotnull,"+
  • AGE+"textnotnull"+");";
  • try{
  • db.execSQL("DROPTABLEIFEXISTS"+TABLE_NAME);
  • db.execSQL(sql);
  • }catch(SQLExceptione){}
  • }
  • /**
  • *插入N条数据
  • */
  • voidInsertRecord(intn){
  • inttotal=id+n;
  • for(;id<total;id++){
  • Stringsql="insertinto"+TABLE_NAME+"("+
  • ID+","+NAME+","+ADDRESS+","+PHONE+","+AGE
  • +")values('"+String.valueOf(id)+"','man','address','123456789','18');";
  • try{
  • db.execSQL(sql);
  • }catch(SQLExceptione){
  • }
  • }
  • }


  • }

分页表格控件GVTable.java的源码:


viewplainprint?


  • packagecom.testSQLite;
  • importjava.util.ArrayList;
  • importjava.util.HashMap;
  • importandroid.content.Context;
  • importandroid.database.Cursor;
  • importandroid.database.sqlite.SQLiteDatabase;
  • importandroid.view.View;
  • importandroid.widget.AdapterView;
  • importandroid.widget.GridView;
  • importandroid.widget.LinearLayout;
  • importandroid.widget.SimpleAdapter;
  • importandroid.widget.AdapterView.OnItemClickListener;
  • publicclassGVTableextendsLinearLayout{
  • protectedGridViewgvTable,gvPage;
  • protectedSimpleAdaptersaPageID,saTable;//适配器
  • protectedArrayList<HashMap<String,String>>srcPageID,srcTable;//数据源

  • protectedintTableRowCount=10;//分页时,每页的Row总数
  • protectedintTableColCount=0;//每页col的数量
  • protectedSQLiteDatabasedb;
  • protectedStringrawSQL="";
  • protectedCursorcurTable;//分页时使用的Cursor
  • protectedOnTableClickListenerclickListener;//整个分页控件被点击时的回调函数
  • protectedOnPageSwitchListenerswitchListener;//分页切换时的回调函数

  • publicGVTable(Contextcontext){
  • super(context);
  • this.setOrientation(VERTICAL);//垂直
  • //----------------------------------------
  • gvTable=newGridView(context);
  • addView(gvTable,newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
  • LayoutParams.WRAP_CONTENT));//宽长式样

  • srcTable=newArrayList<HashMap<String,String>>();
  • saTable=newSimpleAdapter(context,
  • srcTable,//数据来源
  • R.layout.items,//XML实现
  • newString[]{"ItemText"},//动态数组与ImageItem对应的子项
  • newint[]{R.id.ItemText});
  • //添加并且显示
  • gvTable.setAdapter(saTable);
  • gvTable.setOnItemClickListener(newOnItemClickListener(){
  • @Override
  • publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  • longarg3){
  • inty=arg2/curTable.getColumnCount()-1;//标题栏的不算
  • intx=arg2%curTable.getColumnCount();
  • if(clickListener!=null//分页数据被点击
  • &&y!=-1){//点中的不是标题栏时
  • clickListener.onTableClickListener(x,y,curTable);
  • }
  • }
  • });

  • //----------------------------------------
  • gvPage=newGridView(context);
  • gvPage.setColumnWidth(40);//设置每个分页按钮的宽度
  • gvPage.setNumColumns(GridView.AUTO_FIT);//分页按钮数量自动设置
  • addView(gvPage,newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,
  • LayoutParams.WRAP_CONTENT));//宽长式样
  • srcPageID=newArrayList<HashMap<String,String>>();
  • saPageID=newSimpleAdapter(context,
  • srcPageID,//数据来源
  • R.layout.items,//XML实现
  • newString[]{"ItemText"},//动态数组与ImageItem对应的子项
  • newint[]{R.id.ItemText});
  • //添加并且显示
  • gvPage.setAdapter(saPageID);
  • //添加消息处理
  • gvPage.setOnItemClickListener(newOnItemClickListener(){
  • @Override
  • publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  • longarg3){
  • LoadTable(arg2);//根据所选分页读取对应的数据
  • if(switchListener!=null){//分页切换时
  • switchListener.onPageSwitchListener(arg2,srcPageID.size());
  • }
  • }
  • });
  • }
  • /**
  • *清除所有数据
  • */
  • publicvoidgvRemoveAll()
  • {
  • if(this.curTable!=null)
  • curTable.close();
  • srcTable.clear();
  • saTable.notifyDataSetChanged();

  • srcPageID.clear();
  • saPageID.notifyDataSetChanged();

  • }
  • /**
  • *读取指定ID的分页数据,返回当前页的总数据
  • *SQL:Select*FromTABLE_NAMELimit9Offset10;
  • *表示从TABLE_NAME表获取数据,跳过10行,取9行
  • *@parampageID指定的分页ID
  • */
  • protectedvoidLoadTable(intpageID)
  • {
  • if(curTable!=null)//释放上次的数据
  • curTable.close();

  • Stringsql=rawSQL+"Limit"+String.valueOf(TableRowCount)+"Offset"+String.valueOf(pageID*TableRowCount);
  • curTable=db.rawQuery(sql,null);

  • gvTable.setNumColumns(curTable.getColumnCount());//表现为表格的关键点!
  • TableColCount=curTable.getColumnCount();
  • srcTable.clear();
  • //取得字段名称
  • intcolCount=curTable.getColumnCount();
  • for(inti=0;i<colCount;i++){
  • HashMap<String,String>map=newHashMap<String,String>();
  • map.put("ItemText",curTable.getColumnName(i));
  • srcTable.add(map);
  • }

  • //列举出所有数据
  • intrecCount=curTable.getCount();
  • for(inti=0;i<recCount;i++){//定位到一条数据
  • curTable.moveToPosition(i);
  • for(intii=0;ii<colCount;ii++)//定位到一条数据中的每个字段
  • {
  • HashMap<String,String>map=newHashMap<String,String>();
  • map.put("ItemText",curTable.getString(ii));
  • srcTable.add(map);
  • }
  • }

  • saTable.notifyDataSetChanged();
  • }
  • /**
  • *设置表格的最多显示的行数
  • *@paramrow表格的行数
  • */
  • publicvoidgvSetTableRowCount(introw)
  • {
  • TableRowCount=row;
  • }

  • /**
  • *取得表格的最大行数
  • *@return行数
  • */
  • publicintgvGetTableRowCount()
  • {
  • returnTableRowCount;
  • }

  • /**
  • *取得当前分页的Cursor
  • *@return当前分页的Cursor
  • */
  • publicCursorgvGetCurrentTable()
  • {
  • returncurTable;
  • }

  • /**
  • *准备分页显示数据
  • *@paramrawSQLsql语句
  • *@paramdb数据库
  • */
  • publicvoidgvReadyTable(StringrawSQL,SQLiteDatabasedb)
  • {
  • this.rawSQL=rawSQL;
  • this.db=db;
  • }

  • /**
  • *刷新分页栏,更新按钮数量
  • *@paramsqlSQL语句
  • *@paramdb数据库
  • */
  • publicvoidgvUpdatePageBar(Stringsql,SQLiteDatabasedb)
  • {
  • Cursorrec=db.rawQuery(sql,null);
  • rec.moveToLast();
  • longrecSize=rec.getLong(0);//取得总数
  • rec.close();
  • intpageNum=(int)(recSize/TableRowCount)+1;//取得分页数

  • srcPageID.clear();
  • for(inti=0;i<pageNum;i++){
  • HashMap<String,String>map=newHashMap<String,String>();
  • map.put("ItemText","No."+String.valueOf(i));//添加图像资源的ID
  • srcPageID.add(map);
  • }
  • saPageID.notifyDataSetChanged();
  • }
  • //---------------------------------------------------------
  • /**
  • *表格被点击时的回调函数
  • */
  • publicvoidsetTableOnClickListener(OnTableClickListenerclick){
  • this.clickListener=click;
  • }

  • publicinterfaceOnTableClickListener{
  • publicvoidonTableClickListener(intx,inty,Cursorc);
  • }
  • //---------------------------------------------------------
  • /**
  • *分页栏被点击时的回调函数
  • */
  • publicvoidsetOnPageSwitchListener(OnPageSwitchListenerpageSwitch){
  • this.switchListener=pageSwitch;
  • }
  • publicinterfaceOnPageSwitchListener{
  • publicvoidonPageSwitchListener(intpageID,intpageCount);
  • }
  • }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308020-1-1.html 上篇帖子: Android提高第九篇之SQLite分页表格[转] 下篇帖子: 飞鸽传书项目中 sqlite数据库应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表