Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android提高第九篇之SQLite分頁表格

Android提高第九篇之SQLite分頁表格

編輯:Android開發實例

      上次講的Android上的SQLite分頁讀取,只用文本框顯示數據而已,這次就講得更加深入些,實現並封裝一個SQL分頁表格控件,不僅支持分頁還是以表格的形式展示數據。先來看看本文程序運行的動畫:

       這個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的代碼如下,它是“表格區”和“分頁欄”的格單元實現:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout android: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.     <TextView android: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> 

 

 

main.xml的代碼如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:orientation="vertical" android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" android:id="@+id/MainLinearLayout"> 
  5.  
  6.     <Button android:layout_height="wrap_content" 
  7.         android:layout_width="fill_parent" android:id="@+id/btnCreateDB" 
  8.         android:text="創建數據庫"></Button> 
  9.     <Button android:layout_height="wrap_content" 
  10.         android:layout_width="fill_parent" android:text="插入一串實驗數據" android:id="@+id/btnInsertRec"></Button> 
  11.     <Button android:layout_height="wrap_content" android:id="@+id/btnClose" 
  12.         android:text="關閉數據庫" android:layout_width="fill_parent"></Button> 
  13. </LinearLayout> 

 

 

 

演示程序testSQLite.java的源碼:

  1. package com.testSQLite;  
  2.  
  3. import android.app.Activity;  
  4. import android.database.Cursor;  
  5. import android.database.SQLException;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11. import android.widget.LinearLayout;  
  12. import android.widget.Toast;  
  13.  
  14. public class testSQLite extends Activity {  
  15.     GVTable table;  
  16.     Button btnCreateDB, btnInsert, btnClose;  
  17.     SQLiteDatabase db;  
  18.     int id;//添加記錄時的id累加標記,必須全局  
  19.  
  20.     private static final String TABLE_NAME = "stu";  
  21.     private static final String ID = "id";  
  22.     private static final String NAME = "name";  
  23.     private static final String PHONE = "phone";  
  24.     private static final String ADDRESS = "address";  
  25.     private static final String AGE = "age";  
  26.       
  27.     @Override 
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         btnCreateDB = (Button) this.findViewById(R.id.btnCreateDB);  
  32.         btnCreateDB.setOnClickListener(new ClickEvent());  
  33.  
  34.         btnInsert = (Button) this.findViewById(R.id.btnInsertRec);  
  35.         btnInsert.setOnClickListener(new ClickEvent());  
  36.  
  37.         btnClose = (Button) this.findViewById(R.id.btnClose);  
  38.         btnClose.setOnClickListener(new ClickEvent());  
  39.  
  40.         table=new GVTable(this);  
  41.         table.gvSetTableRowCount(8);//設置每個分頁的ROW總數  
  42.         LinearLayout ly = (LinearLayout) findViewById(R.id.MainLinearLayout);  
  43.  
  44.         table.setTableOnClickListener(new GVTable.OnTableClickListener() {  
  45.             @Override 
  46.             public void onTableClickListener(int x,int y,Cursor c) {  
  47.                 c.moveToPosition(y);  
  48.                 String str=c.getString(x)+" 位置:("+String.valueOf(x)+","+String.valueOf(y)+")";  
  49.                 Toast.makeText(testSQLite.this, str, 1000).show();  
  50.             }  
  51.  
  52.         });  
  53.         table.setOnPageSwitchListener(new GVTable.OnPageSwitchListener() {  
  54.               
  55.             @Override 
  56.             public void onPageSwitchListener(int pageID,int pageCount) {  
  57.                 String str="共有"+String.valueOf(pageCount)+  
  58.                 " 當前第"+String.valueOf(pageID)+"頁";  
  59.                 Toast.makeText(testSQLite.this, str, 1000).show();  
  60.             }  
  61.         });  
  62.           
  63.         ly.addView(table);  
  64.     }  
  65.  
  66.     class ClickEvent implements View.OnClickListener {  
  67.  
  68.         @Override 
  69.         public void onClick(View v) {  
  70.             if (v == btnCreateDB) {  
  71.                 CreateDB();  
  72.             } else if (v == btnInsert) {  
  73.                 InsertRecord(16);//插入16條記錄  
  74.  
  75.                 table.gvUpdatePageBar("select count(*) from " + TABLE_NAME,db);  
  76.                 table.gvReadyTable("select * from " + TABLE_NAME,db);  
  77.             }else if (v == btnClose) {  
  78.                 table.gvRemoveAll();  
  79.                 db.close();  
  80.                   
  81.             }  
  82.         }  
  83.     }  
  84.       
  85.     /**  
  86.      * 在內存創建數據庫和數據表  
  87.      */ 
  88.     void CreateDB() {  
  89.         // 在內存創建數據庫  
  90.         db = SQLiteDatabase.create(null);  
  91.         Log.e("DB Path", db.getPath());  
  92.         String amount = String.valueOf(databaseList().length);  
  93.         Log.e("DB amount", amount);  
  94.         // 創建數據表  
  95.         String sql = "CREATE TABLE " + TABLE_NAME + " (" +   
  96.                 ID  + " text not null, " + NAME + " text not null," +  
  97.                 ADDRESS + " text not null, " + PHONE + " text not null," +  
  98.                 AGE + " text not null "+");";  
  99.         try {  
  100.             db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);  
  101.             db.execSQL(sql);  
  102.         } catch (SQLException e) {}  
  103.     }  
  104.  
  105.     /**  
  106.      * 插入N條數據  
  107.      */ 
  108.     void InsertRecord(int n) {  
  109.         int total = id + n;  
  110.         for (; id < total; id++) {  
  111.             String sql = "insert into " + TABLE_NAME + " (" +   
  112.             ID + ", " + NAME+", " + ADDRESS+", " + PHONE+", "+AGE  
  113.                     + ") values('" + String.valueOf(id) + "', 'man','address','123456789','18');";  
  114.             try {  
  115.                 db.execSQL(sql);  
  116.             } catch (SQLException e) {  
  117.             }  
  118.         }  
  119.     }  
  120.       
  121.       
  122.  

 

 

分頁表格控件GVTable.java的源碼:

 

  1. package com.testSQLite;     
  2.     
  3. import java.util.ArrayList;     
  4. import java.util.HashMap;     
  5. import android.content.Context;     
  6. import android.database.Cursor;     
  7. import android.database.sqlite.SQLiteDatabase;     
  8. import android.view.View;     
  9. import android.widget.AdapterView;     
  10. import android.widget.GridView;     
  11. import android.widget.LinearLayout;     
  12. import android.widget.SimpleAdapter;     
  13. import android.widget.AdapterView.OnItemClickListener;     
  14.     
  15. public class GVTable extends LinearLayout {     
  16.     protected GridView gvTable,gvPage;       
  17.     protected SimpleAdapter saPageID,saTable;// 適配器     
  18.     protected ArrayList<HashMap<String, String>> srcPageID,srcTable;// 數據源     
  19.          
  20.     protected int TableRowCount=10;//分頁時,每頁的Row總數     
  21.     protected int TableColCount=0;//每頁col的數量     
  22.     
  23.     protected SQLiteDatabase db;     
  24.     protected String rawSQL="";     
  25.     protected Cursor curTable;//分頁時使用的Cursor     
  26.     protected OnTableClickListener clickListener;//整個分頁控件被點擊時的回調函數     
  27.     protected OnPageSwitchListener switchListener;//分頁切換時的回調函數     
  28.          
  29.     public GVTable(Context context) {     
  30.         super(context);     
  31.         this.setOrientation(VERTICAL);//垂直     
  32.         //----------------------------------------     
  33.         gvTable=new GridView(context);     
  34.         addView(gvTable, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,     
  35.                 LayoutParams.WRAP_CONTENT));//寬長式樣     
  36.              
  37.         srcTable = new ArrayList<HashMap<String, String>>();     
  38.         saTable = new SimpleAdapter(context,     
  39.                 srcTable,// 數據來源     
  40.                 R.layout.items,//XML實現     
  41.                 new String[] { "ItemText" },// 動態數組與ImageItem對應的子項     
  42.                 new int[] { R.id.ItemText });     
  43.         // 添加並且顯示     
  44.         gvTable.setAdapter(saTable);     
  45.         gvTable.setOnItemClickListener(new OnItemClickListener(){     
  46.             @Override    
  47.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,     
  48.                     long arg3) {     
  49.                 int y=arg2/curTable.getColumnCount()-1;//標題欄的不算     
  50.                 int x=arg2 % curTable.getColumnCount();     
  51.                 if (clickListener != null//分頁數據被點擊     
  52.                         && y!=-1) {//點中的不是標題欄時     
  53.                     clickListener.onTableClickListener(x,y,curTable);     
  54.                 }     
  55.             }     
  56.         });     
  57.              
  58.         //----------------------------------------     
  59.         gvPage=new GridView(context);     
  60.         gvPage.setColumnWidth(40);//設置每個分頁按鈕的寬度     
  61.         gvPage.setNumColumns(GridView.AUTO_FIT);//分頁按鈕數量自動設置     
  62.         addView(gvPage, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,     
  63.                 LayoutParams.WRAP_CONTENT));//寬長式樣     
  64.         srcPageID = new ArrayList<HashMap<String, String>>();     
  65.         saPageID = new SimpleAdapter(context,     
  66.                 srcPageID,// 數據來源     
  67.                 R.layout.items,//XML實現     
  68.                 new String[] { "ItemText" },// 動態數組與ImageItem對應的子項     
  69.                 new int[] { R.id.ItemText });     
  70.     
  71.         // 添加並且顯示     
  72.         gvPage.setAdapter(saPageID);     
  73.         // 添加消息處理     
  74.         gvPage.setOnItemClickListener(new OnItemClickListener(){     
  75.             @Override    
  76.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,     
  77.                     long arg3) {     
  78.                 LoadTable(arg2);//根據所選分頁讀取對應的數據     
  79.                 if(switchListener!=null){//分頁切換時     
  80.                     switchListener.onPageSwitchListener(arg2,srcPageID.size());     
  81.                 }     
  82.             }     
  83.         });     
  84.     }     
  85.     
  86.     /**    
  87.      * 清除所有數據    
  88.      */    
  89.     public void gvRemoveAll()     
  90.     {     
  91.         if(this.curTable!=null)     
  92.             curTable.close();     
  93.         srcTable.clear();     
  94.         saTable.notifyDataSetChanged();     
  95.          
  96.         srcPageID.clear();     
  97.         saPageID.notifyDataSetChanged();     
  98.              
  99.     }     
  100.     /**    
  101.      * 讀取指定ID的分頁數據,返回當前頁的總數據    
  102.      * SQL:Select * From TABLE_NAME Limit 9 Offset 10;    
  103.      * 表示從TABLE_NAME表獲取數據,跳過10行,取9行    
  104.      * @param pageID 指定的分頁ID    
  105.      */    
  106.     protected void LoadTable(int pageID)     
  107.     {     
  108.         if(curTable!=null)//釋放上次的數據     
  109.             curTable.close();     
  110.              
  111.         String sql= rawSQL+" Limit "+String.valueOf(TableRowCount)+ " Offset " +String.valueOf(pageID*TableRowCount);     
  112.         curTable = db.rawQuery(sql, null);     
  113.              
  114.         gvTable.setNumColumns(curTable.getColumnCount());//表現為表格的關鍵點!     
  115.         TableColCount=curTable.getColumnCount();     
  116.         srcTable.clear();     
  117.         // 取得字段名稱     
  118.         int colCount = curTable.getColumnCount();     
  119.         for (int i = 0; i < colCount; i++) {     
  120.             HashMap<String, String> map = new HashMap<String, String>();     
  121.             map.put("ItemText", curTable.getColumnName(i));     
  122.             srcTable.add(map);     
  123.         }     
  124.              
  125.         // 列舉出所有數據     
  126.         int recCount=curTable.getCount();     
  127.         for (int i = 0; i < recCount; i++) {//定位到一條數據     
  128.             curTable.moveToPosition(i);     
  129.             for(int ii=0;ii<colCount;ii++)//定位到一條數據中的每個字段     
  130.             {     
  131.                 HashMap<String, String> map = new HashMap<String, String>();     
  132.                 map.put("ItemText", curTable.getString(ii));     
  133.                 srcTable.add(map);     
  134.             }     
  135.         }     
  136.              
  137.         saTable.notifyDataSetChanged();     
  138.     }     
  139.     
  140.     /**    
  141.      * 設置表格的最多顯示的行數    
  142.      * @param row 表格的行數    
  143.      */    
  144.     public void gvSetTableRowCount(int row)     
  145.     {     
  146.         TableRowCount=row;     
  147.     }     
  148.          
  149.     /**    
  150.      * 取得表格的最大行數        
  151.      * @return 行數    
  152.      */    
  153.     public int gvGetTableRowCount()     
  154.     {     
  155.         return TableRowCount;     
  156.     }     
  157.          
  158.     /**    
  159.      * 取得當前分頁的Cursor    
  160.      * @return 當前分頁的Cursor    
  161.      */    
  162.     public Cursor gvGetCurrentTable()     
  163.     {     
  164.         return curTable;     
  165.     }     
  166.              
  167.     /**    
  168.      * 准備分頁顯示數據    
  169.      * @param rawSQL sql語句    
  170.      * @param db 數據庫    
  171.      */    
  172.     public void gvReadyTable(String rawSQL,SQLiteDatabase db)     
  173.     {     
  174.         this.rawSQL=rawSQL;     
  175.         this.db=db;     
  176.     }     
  177.          
  178.     /**    
  179.      * 刷新分頁欄,更新按鈕數量    
  180.      * @param sql SQL語句    
  181.      * @param db 數據庫    
  182.      */    
  183.     public void gvUpdatePageBar(String sql,SQLiteDatabase db)     
  184.     {     
  185.         Cursor rec = db.rawQuery(sql, null);     
  186.         rec.moveToLast();     
  187.         long recSize=rec.getLong(0);//取得總數     
  188.         rec.close();     
  189.         int pageNum=(int)(recSize/TableRowCount) + 1;//取得分頁數     
  190.              
  191.         srcPageID.clear();     
  192.         for (int i = 0; i < pageNum; i++) {     
  193.             HashMap<String, String> map = new HashMap<String, String>();     
  194.             map.put("ItemText", "No." + String.valueOf(i));// 添加圖像資源的ID     
  195.     
  196.             srcPageID.add(map);     
  197.         }     
  198.         saPageID.notifyDataSetChanged();     
  199.     }     
  200.     
  201.     //---------------------------------------------------------     
  202.     /**    
  203.      * 表格被點擊時的回調函數    
  204.      */    
  205.     public void setTableOnClickListener(OnTableClickListener click) {     
  206.         this.clickListener = click;     
  207.     }     
  208.          
  209.     public interface OnTableClickListener {     
  210.         public void onTableClickListener(int x,int y,Cursor c);     
  211.     }     
  212.     //---------------------------------------------------------     
  213.     /**    
  214.      * 分頁欄被點擊時的回調函數    
  215.      */    
  216.     public void setOnPageSwitchListener(OnPageSwitchListener pageSwitch) {     
  217.         this.switchListener = pageSwitch;     
  218.     }     
  219.     public interface OnPageSwitchListener {     
  220.         public void onPageSwitchListener(int pageID,int pageCount);     
  221.     }     
  222. }   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved