這題跟猜數字並列我最不想抽到的兩題...
layout要自己拉,所以元件必然要自己接,這樣就算了 SQLiteOpenHelper 居然還沒有附,整個 class 要重頭自己打,這真的30分鐘做得完就見鬼了...
首先第一個麻煩是 layout,從書上的畫面要求上看起來是 Relative 可是專案給的是 Linear... 所以花了不少的時間在研究要怎麼用 Linear 排出畫面,最後弄得好像還是跟書上的有點些微的差距。
用4個 Linear組合出來,如下圖所示
可以看到,配置重點是在第二層 Linear orientation 設定為 horizontal,有一點要特別注意就是 ListView 就算寬度設定為 wrap_content,它還是會把容器撐開造成看不到後面的按鈕,所以不得不把寬度寫死。
<ListView android:id="@+id/myListView" android:layout_height="wrap_content" android:layout_width="200dp" />
再來 ListView 用的 list.xml 也要自己做,本來想嘗試用 android.R 去解決,但是 findViewById 抓不到系統預設 list 的 checkBox,上網一查,方法還真麻煩...還不如乖乖自己做一個 list。
在做的時候特別要注意的是在 ListView 中設 onItemClick 的監聽,但是這個監聽器在 list 的 view 中有其他可觸發元件(Button、CheckBox等...)的時候會被蓋過不會觸發,要想讓它可以運作就必須把這些元件的可按性跟可焦點性關掉。
<CheckBox ... android:clickable="false" android:focusable="false" />不然就會按到 checkBox 然後沒有觸發任何東西,說起來這個之前做專題的時候碰過,不然不知道要在這裡卡多久...
主程式部分剩下比較重要的就是 adapter 要怎麼建構跟要記得用一組 boolean[] 去紀錄選取狀態。
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list, myCursor, new String[] { "note" }, new int[] { R.id.listTxt_TextView });
再來就是 SQLiteOpenHelper 的部分,看這題的題意就是要我們把這東西給硬吃下去了...
public class mySQLiteOpenHelper extends SQLiteOpenHelper { private final static String DATABASE_NAME = "todo_db"; private final static int DATABASE_VERSION = 6; private final static String TABLE_NAME = "notes"; public final static String FIELD_id = "_id"; public mySQLiteOpenHelper(Context context) { //---建構子,原則上照做就好。 super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //---首次建構,建構資料表。 String sql = "CREATE TABLE " + TABLE_NAME + " (" + FIELD_id + " INTEGER PRIMARY KEY, note TEXT NOT NULL, created INTEGER)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //---在db_version改變時會重做這個部分。 //---下面這組是刪掉資料表然後重新寫入一次。 String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; db.execSQL(sql); onCreate(db); //---這題要求的預先寫入值。 ContentValues values = new ContentValues(); values.clear(); values.put("note", "BOOK"); values.put("created", 10); db.insert(TABLE_NAME, null, values); values.clear(); values.put("note", "FOOD"); values.put("created", 10); db.insert(TABLE_NAME, null, values); values.clear(); values.put("note", "TOOL"); values.put("created", 10); db.insert(TABLE_NAME, null, values); } public Cursor select() { //---無col, where, sort...等篩選排序條件之選取。 SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db .query(TABLE_NAME, null, null, null, null, null, null); return cursor; } }光是想到臨場要打這麼大一坨就快挫了...為了考個證照到頭來又回到國小背書這種腦殘作法。
沒有留言:
張貼留言