Android:ListViewとAdapter、そしてSQLiteを使う
【環境】Android Studio 1.3
上の動画のように
品名・産地・個数・単価をデータベースに保存し、
各ラジオボタンを選択して表示させています。
Database・Adapter・ListViewの関係性を図にしてみました。
データを取得したArrayListさんから
データを見せるListViewさんへ直接データを渡す事は出来ず、
Adapterさんが二人の間を取り持つ重大な役目を果たしています。
Adapterさんは思います。
「面倒くせえな。。。」(←はい、これは私の気持ちですw)
1. strings.xmlの編集
src/main/res/values/strings.xml (←既存ファイルを編集)
各画面で使っているテキストを設定。
2. AndroidManifest.xmlの編集
src/main/AndroidManifest.xml (←既存ファイルを編集)
21行目〜28行目で各画面へ
インテント(画面遷移)する為のアクティビティ名を追加。
3. メイン画面の編集
3 - 1. 実装している事
【レイアウト側】
- 各EditTextの入力文字数制限。
- 各EditTextに対してキーボードの種類を指定。
※ ellipsize="end"で各EditTextは
末尾を「...」表示にするように設定していますが、
maxLengthで文字数の制限も行っている為、
私のスマホでは「...」になるまでに文字数に制限がかかるので
「...」は表示されませんが、念のために☆
【クラス側】
- 各RadioButtonを選択し、表示ボタン押下時に画面遷移。
- 登録ボタン押下時、入力したデータをDBへ保存。
- 各EditTextで未入力があった場合、※印とトースト表示。
3 - 2. activity_main.xmlの編集
src/main/res/layout/activity_main.xml (←既存ファイルを編集)
3 - 3. Databaseに関するクラスを作る
今回の肝心要であるデータベース!!
AndroidでデータベースのSQLiteを扱うために必要な
SQLiteOpenHelperを継承したクラスと、
データベースを取得・削除・検索するといったアダプタークラスを作ります。
src/main/java/example/com/dbsample/DBAdapter.java (←新規作成)
トランザクション
レコードの追加や削除をする時は、
Transaction(トランザクション)をかけましょう。
【メリット】
- 処理速度が上がる。
- 途中で失敗した場合、ロールバックができます。
上のコードでも追加や削除の時に使っている例を挙げると、
db.beginTransaction(); // トランザクション開始 try { db.delete(DB_TABLE, null, null); // DBのレコードを全削除 db.setTransactionSuccessful(); // トランザクションへコミット } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); // トランザクションの終了 }
こんな感じで、削除の前にbeginTransaction()でトランザクションを開始し、
削除が終わるとsetTransactionSuccessful()でトランザクションへコミット、
そして、endTransaction()でトランザクションの終了☆
データベースについてのクラスを作れたので、
心置きなく使って、メインや他のページに実装していきます。
3 - 4. MainActivity.javaの編集
src/main/java/example/com/dbsample/MainActivity.java (←既存ファイルを編集)
4. 品名一覧画面の編集
4 - 1. 実装している事
【レイアウト側】
ListViewは何も設定していないと、行をクリック(タップ)した時、色が付きますが、
今回は行には何もイベントを持たせなかったので、色が付く事を防いでいます。
【クラス側】
- 品名だけを表示。
- 読み込んだデータをListViewを使って一覧表示
- [全削除]ボタンを押下時、データベースから全てのデータを削除。
4 - 2. select_sheet_product.xmlの編集
src/main/res/layout/select_sheet_product.xml (←新規作成)
4 - 3. SelectSheetProduct.javaの編集
src/main/java/example/com/dbsample/SelectSheetProduct.java (←新規作成)
5. ListView表示画面の編集
5 - 1. 実装している事
【レイアウト側】
レイアウトのカスタムが出来るBaseAdapterを使っているので、
1行に対するレイアウトを整えたxmlファイルも用意。
【クラス側】
行を長押しするとダイアログが現れ、
[OK]を選択した時は、その行のデータをDatabaseから削除。
5 - 2. select_sheet_listview.xmlの編集
このxmlファイルは土台となるレイアウトを作っています。
src/main/res/layout/select_sheet_listview.xml (←新規作成)
5 - 3. row_sheet_listview.xmlの編集
このxmlファイルは1行に対するレイアウトを作っています。
src/main/res/layout/row_sheet_listview.xml (←新規作成)
5 - 4. MyListItem.javaの編集
src/main/java/example/com/dbsample/MyListItem.java (←新規作成)
5 - 5. SelectSheetListView.javaの編集
src/main/java/example/com/dbsample/SelectSheetListView.java (←新規作成)
今回は結構、長文になってしまい、、、
まだ途中ですが、力尽きそう(´Д` )
けれど、最後のレイアウト
いっきまーーーーす☆
最後のレイアウトはLisViewは使わずに、
TableLayoutを使っています。
6. TableLayout表示画面の編集
6 - 1. 実装している事
【レイアウト側】
- 検索窓を実装。
- 行の色を交互に指定。
【クラス側】
- 検索窓で入力した文字からデーターベースの品名と一致するデータを表示。
- 読み込んだデータをTableRayoutを使って一覧表示。
今回は、検索窓で入力した文字に対して前方一致とか部分一致の
あいまい検索を設定していませんが、
実用化を図るなら設定してあげた方が良いですね(^^)
6 - 2. row_deco1.xmlとrow_deco2.xmlの編集
これら2つのxmlファイルはTableRayoutのTableRow(行)の
背景(色と角丸を設定)に使うxmlファイルです。
src/main/res/drawable/row_deco1.xml (←新規作成)
src/main/res/drawable/row_deco2.xml (←新規作成)
6 - 3. select_sheet_table.xmlの編集
このxmlファイルは土台となるレイアウトを作っています。
【注意】
ScrollViewの中に入っている子View(この場合はTableLayout)に
margin指定をした場合、
スクロールしても行の最後まで表示されず、
途中で切れてしまうので、設定しないように気をつけましょう。
src/main/res/layout/select_sheet_table.xml (←新規作成)
6 - 4. SelectSheetTable.javaの編集
src/main/java/example/com/dbsample/SelectSheetTable.java (←新規作成)
以上、長々と失礼いたしました!!
さすがにこれだけの量を書いたり、
図を作ったりすると
予想以上に時間を費やしてしまいました(´Д` )
今の気分はチョコレートを食べたいです☆