亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android提高之SQLite分頁表格實現方法

2020-04-11 11:46:01
字體:
來源:轉載
供稿:網友

繼前一篇文章講到Android上的SQLite分頁讀取,其功能只是用文本框顯示數據而已。本文就講得更加深入些,實現并封裝一個SQL分頁表格控件,不僅支持分頁還是以表格的形式展示數據。

先來看看本文程序運行的動畫如下圖所示:

這個SQL分頁表格控件主要分為“表格區”和“分頁欄”這兩部分,這兩部分都是基于GridView實現的。網上介紹Android上實現表格的DEMO一般都用ListView。ListView與GridView對比,ListView最大的優勢是格單元的大小可以自定義,可以某單元長某單元短,但是難于實現自適應數據表的結構;而GridView最大的優勢就是自適應數據表的結構,但是格單元統一大小。對于數據表結構多變的情況,建議使用GridView實現表格。

本文實現的SQL分頁表格控件有以下特點:

1.自適應數據表結構,但是格單元統一大小;

2.支持分頁;

3.“表格區”有按鍵事件回調處理,“分頁欄”有分頁切換事件回調處理。

本文程序代碼較多,可以到這里下載整個工程的源碼:http://xiazai.VeVB.COm/201408/yuanma/testSQLite(jb51.bet).rar

items.xml的代碼如下,它是“表格區”和“分頁欄”的格單元實現:

<?xml version="1.0" encoding="utf-8"?><LinearLayout android: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"> <TextView android: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的代碼如下:

<?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" android:id="@+id/MainLinearLayout"> <Button android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/btnCreateDB" android:text="創建數據庫"></Button> <Button android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="插入一串實驗數據" android:id="@+id/btnInsertRec"></Button> <Button android:layout_height="wrap_content" android:id="@+id/btnClose" android:text="關閉數據庫" android:layout_width="fill_parent"></Button></LinearLayout>

演示程序testSQLite.java的源碼如下:

package com.testSQLite;import android.app.Activity;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Toast;public class testSQLite extends Activity { GVTable table; Button btnCreateDB, btnInsert, btnClose; SQLiteDatabase db; int id;//添加記錄時的id累加標記,必須全局 private static final String TABLE_NAME = "stu"; private static final String ID = "id"; private static final String NAME = "name"; private static final String PHONE = "phone"; private static final String ADDRESS = "address"; private static final String AGE = "age";  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnCreateDB = (Button) this.findViewById(R.id.btnCreateDB); btnCreateDB.setOnClickListener(new ClickEvent()); btnInsert = (Button) this.findViewById(R.id.btnInsertRec); btnInsert.setOnClickListener(new ClickEvent()); btnClose = (Button) this.findViewById(R.id.btnClose); btnClose.setOnClickListener(new ClickEvent()); table=new GVTable(this); table.gvSetTableRowCount(8);//設置每個分頁的ROW總數 LinearLayout ly = (LinearLayout) findViewById(R.id.MainLinearLayout); table.setTableOnClickListener(new GVTable.OnTableClickListener() {  @Override  public void onTableClickListener(int x,int y,Cursor c) {  c.moveToPosition(y);  String str=c.getString(x)+" 位置:("+String.valueOf(x)+","+String.valueOf(y)+")";  Toast.makeText(testSQLite.this, str, 1000).show();  } }); table.setOnPageSwitchListener(new GVTable.OnPageSwitchListener() {    @Override  public void onPageSwitchListener(int pageID,int pageCount) {  String str="共有"+String.valueOf(pageCount)+  " 當前第"+String.valueOf(pageID)+"頁";  Toast.makeText(testSQLite.this, str, 1000).show();  } });  ly.addView(table); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) {  if (v == btnCreateDB) {  CreateDB();  } else if (v == btnInsert) {  InsertRecord(16);//插入16條記錄  table.gvUpdatePageBar("select count(*) from " + TABLE_NAME,db);  table.gvReadyTable("select * from " + TABLE_NAME,db);  }else if (v == btnClose) {  table.gvRemoveAll();  db.close();    } } }  /** * 在內存創建數據庫和數據表 */ void CreateDB() { // 在內存創建數據庫 db = SQLiteDatabase.create(null); Log.e("DB Path", db.getPath()); String amount = String.valueOf(databaseList().length); Log.e("DB amount", amount); // 創建數據表 String sql = "CREATE TABLE " + TABLE_NAME + " (" +      ID + " text not null, " + NAME + " text not null," +     ADDRESS + " text not null, " + PHONE + " text not null," +     AGE + " text not null "+");"; try {  db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);  db.execSQL(sql); } catch (SQLException e) {} } /** * 插入N條數據 */ void InsertRecord(int n) { int total = id + n; for (; id < total; id++) {  String sql = "insert into " + TABLE_NAME + " (" +   ID + ", " + NAME+", " + ADDRESS+", " + PHONE+", "+AGE   + ") values('" + String.valueOf(id) + "', 'man','address','123456789','18');";  try {  db.execSQL(sql);  } catch (SQLException e) {  } } }}

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

package com.testSQLite;import java.util.ArrayList;import java.util.HashMap;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.view.View;import android.widget.AdapterView;import android.widget.GridView;import android.widget.LinearLayout;import android.widget.SimpleAdapter;import android.widget.AdapterView.OnItemClickListener;public class GVTable extends LinearLayout { protected GridView gvTable,gvPage;  protected SimpleAdapter saPageID,saTable;// 適配器 protected ArrayList<HashMap<String, String>> srcPageID,srcTable;// 數據源  protected int TableRowCount=10;//分頁時,每頁的Row總數 protected int TableColCount=0;//每頁col的數量 protected SQLiteDatabase db; protected String rawSQL=""; protected Cursor curTable;//分頁時使用的Cursor protected OnTableClickListener clickListener;//整個分頁控件被點擊時的回調函數 protected OnPageSwitchListener switchListener;//分頁切換時的回調函數  public GVTable(Context context) { super(context); this.setOrientation(VERTICAL);//垂直 //---------------------------------------- gvTable=new GridView(context); addView(gvTable, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,        LayoutParams.WRAP_CONTENT));//寬長式樣  srcTable = new ArrayList<HashMap<String, String>>(); saTable = new SimpleAdapter(context,  srcTable,// 數據來源  R.layout.items,//XML實現  new String[] { "ItemText" },// 動態數組與ImageItem對應的子項  new int[] { R.id.ItemText }); // 添加并且顯示 gvTable.setAdapter(saTable); gvTable.setOnItemClickListener(new OnItemClickListener(){  @Override  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,   long arg3) {  int y=arg2/curTable.getColumnCount()-1;//標題欄的不算  int x=arg2 % curTable.getColumnCount();  if (clickListener != null//分頁數據被點擊   && y!=-1) {//點中的不是標題欄時   clickListener.onTableClickListener(x,y,curTable);  }  } }); //---------------------------------------- gvPage=new GridView(context); gvPage.setColumnWidth(40);//設置每個分頁按鈕的寬度 gvPage.setNumColumns(GridView.AUTO_FIT);//分頁按鈕數量自動設置 addView(gvPage, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,        LayoutParams.WRAP_CONTENT));//寬長式樣 srcPageID = new ArrayList<HashMap<String, String>>(); saPageID = new SimpleAdapter(context,  srcPageID,// 數據來源  R.layout.items,//XML實現  new String[] { "ItemText" },// 動態數組與ImageItem對應的子項  new int[] { R.id.ItemText }); // 添加并且顯示 gvPage.setAdapter(saPageID); // 添加消息處理 gvPage.setOnItemClickListener(new OnItemClickListener(){  @Override  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,   long arg3) {  LoadTable(arg2);//根據所選分頁讀取對應的數據    if(switchListener!=null){//分頁切換時    switchListener.onPageSwitchListener(arg2,srcPageID.size());    }  }   }); } /** * 清除所有數據 */ public void gvRemoveAll() { if(this.curTable!=null)  curTable.close(); srcTable.clear(); saTable.notifyDataSetChanged();  srcPageID.clear(); saPageID.notifyDataSetChanged(); } /** * 讀取指定ID的分頁數據,返回當前頁的總數據 * SQL:Select * From TABLE_NAME Limit 9 Offset 10; * 表示從TABLE_NAME表獲取數據,跳過10行,取9行 * @param pageID 指定的分頁ID */ protected void LoadTable(int pageID) { if(curTable!=null)//釋放上次的數據  curTable.close();    String sql= rawSQL+" Limit "+String.valueOf(TableRowCount)+ " Offset " +String.valueOf(pageID*TableRowCount);   curTable = db.rawQuery(sql, null);      gvTable.setNumColumns(curTable.getColumnCount());//表現為表格的關鍵點!   TableColCount=curTable.getColumnCount();   srcTable.clear();   // 取得字段名稱   int colCount = curTable.getColumnCount(); for (int i = 0; i < colCount; i++) {  HashMap<String, String> map = new HashMap<String, String>();  map.put("ItemText", curTable.getColumnName(i));  srcTable.add(map); } // 列舉出所有數據 int recCount=curTable.getCount(); for (int i = 0; i < recCount; i++) {//定位到一條數據  curTable.moveToPosition(i);  for(int ii=0;ii<colCount;ii++)//定位到一條數據中的每個字段  {  HashMap<String, String> map = new HashMap<String, String>();  map.put("ItemText", curTable.getString(ii));  srcTable.add(map);  } } saTable.notifyDataSetChanged(); } /** * 設置表格的最多顯示的行數 * @param row 表格的行數 */ public void gvSetTableRowCount(int row) { TableRowCount=row; }  /** * 取得表格的最大行數  * @return 行數 */ public int gvGetTableRowCount() { return TableRowCount; } /** * 取得當前分頁的Cursor * @return 當前分頁的Cursor */ public Cursor gvGetCurrentTable() { return curTable; } /** * 準備分頁顯示數據 * @param rawSQL sql語句 * @param db 數據庫 */ public void gvReadyTable(String rawSQL,SQLiteDatabase db) { this.rawSQL=rawSQL; this.db=db; } /** * 刷新分頁欄,更新按鈕數量 * @param sql SQL語句 * @param db 數據庫 */ public void gvUpdatePageBar(String sql,SQLiteDatabase db) { Cursor rec = db.rawQuery(sql, null); rec.moveToLast(); long recSize=rec.getLong(0);//取得總數 rec.close(); int pageNum=(int)(recSize/TableRowCount) + 1;//取得分頁數  srcPageID.clear(); for (int i = 0; i < pageNum; i++) {  HashMap<String, String> map = new HashMap<String, String>();  map.put("ItemText", "No." + String.valueOf(i));// 添加圖像資源的ID  srcPageID.add(map); } saPageID.notifyDataSetChanged(); } //--------------------------------------------------------- /** * 表格被點擊時的回調函數 */ public void setTableOnClickListener(OnTableClickListener click) { this.clickListener = click; }  public interface OnTableClickListener { public void onTableClickListener(int x,int y,Cursor c); } //--------------------------------------------------------- /** * 分頁欄被點擊時的回調函數 */ public void setOnPageSwitchListener(OnPageSwitchListener pageSwitch) { this.switchListener = pageSwitch; } public interface OnPageSwitchListener { public void onPageSwitchListener(int pageID,int pageCount); }}

希望本文所述實例對于大家進行Android項目開發能起到參考借鑒作用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黄网免费在线观看| 精品国产视频在线| 久久精品视频一| 韩日精品中文字幕| 91麻豆桃色免费看| 亚洲色图13p| 亚洲最新视频在线| 成人激情视频在线观看| 亚洲欧洲av一区二区| 国产亚洲精品日韩| 欧美在线激情网| 中文字幕日本精品| 亚洲日韩中文字幕在线播放| 97国产成人精品视频| 91国产一区在线| 92国产精品久久久久首页| 精品久久久久国产| 美女扒开尿口让男人操亚洲视频网站| 亚洲精品国产成人| 亚洲国产精品久久久久| 揄拍成人国产精品视频| 日韩电影在线观看永久视频免费网站| 亚洲天天在线日亚洲洲精| 欧美有码在线视频| 热久久美女精品天天吊色| 成人黄色生活片| 国产香蕉一区二区三区在线视频| 在线免费观看羞羞视频一区二区| 国产精品欧美一区二区三区奶水| 欧美日韩中文在线观看| 美女av一区二区三区| 亚洲人成电影在线观看天堂色| 91产国在线观看动作片喷水| 欧美激情一区二区三级高清视频| 538国产精品一区二区免费视频| 国产福利视频一区| 久久伊人精品天天| 亚洲aⅴ男人的天堂在线观看| 色综合91久久精品中文字幕| 亚洲天堂男人天堂女人天堂| 久久久精品视频在线观看| 欧美孕妇性xx| 国产精品美女免费| 97碰碰碰免费色视频| 国产亚洲精品成人av久久ww| 亚洲激情在线观看视频免费| 欧日韩不卡在线视频| 中文字幕精品www乱入免费视频| 91免费福利视频| 久久久国产精彩视频美女艺术照福利| 国产丝袜一区二区三区免费视频| 国产精品视频在线观看| 国产精品高清网站| 欧美电影免费观看大全| 91精品久久久久久| 在线视频精品一| 久久久免费精品| 神马久久桃色视频| 亚洲人成电影网站色www| 亚洲一区二区三区视频| 69av在线播放| 久久久精品在线观看| 欧美风情在线观看| 亚洲精选中文字幕| 亚洲第一男人天堂| 欧美wwwwww| 亚洲第一网中文字幕| 精品久久久久久久久久| 97视频在线观看视频免费视频| 黑人极品videos精品欧美裸| 久久久天堂国产精品女人| 日韩黄色av网站| 亚洲精品永久免费精品| 日韩精品中文字幕在线播放| 亚洲人成人99网站| 欧美性xxxx极品hd满灌| 精品国产一区二区三区久久久狼| 成人亚洲综合色就1024| 亚洲欧洲av一区二区| 国产日韩欧美中文在线播放| 亚洲第一网站免费视频| 日韩av免费在线播放| 韩国精品美女www爽爽爽视频| 亚洲欧美日韩国产中文专区| 亚洲天堂av网| 亚洲伊人久久大香线蕉av| 中文字幕日韩av| 精品久久久久久电影| 成人伊人精品色xxxx视频| 亚洲欧美变态国产另类| 国产日本欧美在线观看| 欧美激情一区二区三区久久久| 国自产精品手机在线观看视频| 国产欧美日韩免费| 久久精品2019中文字幕| 午夜精品三级视频福利| 日韩欧美在线视频日韩欧美在线视频| 久久久久久久999精品视频| 国产精品88a∨| 日韩中文字幕视频在线观看| 亚洲最大激情中文字幕| 91禁外国网站| 97色伦亚洲国产| 欧美一级在线亚洲天堂| 久久av红桃一区二区小说| 成人黄色av网| 亚洲偷欧美偷国内偷| 国产欧美日韩专区发布| 亚洲字幕在线观看| 日本精品免费观看| 国产精品欧美在线| 国产精品美腿一区在线看| 亚洲男人的天堂网站| 国产日韩精品在线| 国内精品久久久久久| 亚洲精品在线观看www| 亚洲一区二区三区香蕉| 欧美综合在线第二页| 69视频在线免费观看| 欧美成人免费一级人片100| 久久综合色88| 在线午夜精品自拍| 亚洲女人被黑人巨大进入| 日本人成精品视频在线| 成人黄色免费片| 91国内免费在线视频| 精品人伦一区二区三区蜜桃免费| 91在线高清视频| 成人午夜激情网| 欧美精品免费播放| 久久在精品线影院精品国产| 精品国产一区二区三区久久狼5月| 性金发美女69hd大尺寸| 精品亚洲一区二区三区| 黄色成人在线播放| 日韩免费在线电影| 欧美激情视频三区| 亚洲精品视频免费在线观看| 91精品国产综合久久香蕉的用户体验| 国产精品一区二区电影| 91精品国产91久久久久福利| 亚洲影视中文字幕| 一区二区欧美在线| 亚洲欧美三级在线| 成人黄色午夜影院| 国产精品h片在线播放| 这里只有精品在线观看| 国产亚洲激情视频在线| 69视频在线播放| 亚洲免费中文字幕| 国产这里只有精品| 精品久久久久久久久久| 97免费在线视频| 亚洲一区二区福利| 亚洲精品一区久久久久久| 欧美伦理91i| 亚洲视频在线免费看| 欧美另类极品videosbest最新版本| 久久69精品久久久久久久电影好| 欧美日韩国产一区二区三区| 欧美国产一区二区三区| 欧美富婆性猛交| 91国产高清在线| 日韩国产高清污视频在线观看|