asky

主にAndroidやiOSの開発について綴っています。また、使っている好きなアプリや全く関係のない話はDiaryで書いていきたいです。

Android:ListViewとAdapter、そしてSQLiteを使う

【環境】Android Studio 1.3

f:id:asky0113:20180529231216g:plain

上の動画のように
品名・産地・個数・単価をデータベースに保存し、
ラジオボタンを選択して表示させています。

Database・Adapter・ListViewの関係性を図にしてみました。

f:id:asky0113:20160507222932p:plain

データを取得したArrayListさんから
データを見せるListViewさんへ直接データを渡す事は出来ず、
Adapterさんが二人の間を取り持つ重大な役目を果たしています。

Adapterさんは思います。
「面倒くせえな。。。」(←はい、これは私の気持ちですw)

1. strings.xmlの編集

src/main/res/values/strings.xml (←既存ファイルを編集)

各画面で使っているテキストを設定。


2. AndroidManifest.xmlの編集

src/main/AndroidManifest.xml (←既存ファイルを編集)

21行目〜28行目で各画面へ
インテント(画面遷移)する為のアクティビティ名を追加。


3. メイン画面の編集

f:id:asky0113:20160507224349p:plain


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. 品名一覧画面の編集

f:id:asky0113:20160507231809p:plain


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表示画面の編集

f:id:asky0113:20160507233134p:plain


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表示画面の編集

f:id:asky0113:20160507234000p:plain


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 (←新規作成)


以上、長々と失礼いたしました!!

さすがにこれだけの量を書いたり、
図を作ったりすると
予想以上に時間を費やしてしまいました(´Д` )

今の気分はチョコレートを食べたいです☆