2011年8月30日 星期二

【Android】TQC+題組系列2(六)


這題跟猜數字並列我最不想抽到的兩題...

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;
    }
}
光是想到臨場要打這麼大一坨就快挫了...為了考個證照到頭來又回到國小背書這種腦殘作法。

沒有留言:

張貼留言