駆け出しエンジニアぱかぱかの成長記録

引くほど忘れっぽい新卒2年目駆け出しSEぱかぱかの備忘録です。

【Android】内部ストレージに画像を保存しリストで表示する②

こんにちは!ぱかぱかです!
今日は現在開発を進めている飲食店記録アプリ「グルメノート」で、画像を内部ストレージに保存した後にそれを取得してリストに表示する実装についてまとめる記事の2つ目です。
長くなりそうと思って記事を分けたのですが、2つ目の方がだいぶ軽めになりそうです。

前回の記事

radish-se.hatenablog.com

行った店登録画面で登録した画像を内部ストレージに保存し、DBにそのパス情報を残せるようにした。

写真選択ツール
保存する写真を選択する。

内部ストレージ
内部ストレージに画像が保存される。

データベース
DBには保存された画像のファイル名が保存される。


今回のゴール

行った店リストでDBのパス情報を元に内部ストレージから画像を取得して表示する。

RecyclerView内で保存した画像を表示する

行った店登録画面で登録した情報は以下のように行った店登録リストに表示される想定です。
今までは何でもNoImage画像を表示するように実装していたので、以下のように表示されています。

ここでリストのNoImage画像の情報を詰めている箇所で、引数にDBに保存した画像のファイル名を渡し以下の処理を呼び出すようにします。

    private fun convertDrawable(fileName: String): Drawable {
        return try {
            if (fileName != "no_image") {
                // ディレクトリ取得
                val directory = ContextWrapper(getApplication()).getDir(
                    "image",
                    Context.MODE_PRIVATE
                )
                // File生成
                val file = File(directory, fileName)
                // Bitmap生成
                val bitmap = BitmapFactory.decodeFile(file.toString())
                // Drawable生成
                return bitmap.toDrawable(getApplication<Application>().resources)
            } else {
                // 画像の登録が無い場合、NoImage画像を登録
                return ContextCompat.getDrawable(getApplication(), R.drawable.no_image)!!
            }
        } catch (e: FileNotFoundException) {
            // FileNotFoundExceptionが発生した場合NoImage画像を登録
            ContextCompat.getDrawable(getApplication(), R.drawable.no_image)!!
        }
    }

画像の登録がない場合はfileNameに"no_image"という文字列を保存しているため、その時はリソース上のNoImage画像を表示します。

fileNameに"no_image"ではない場合、内部ストレージのディレクトリまでのパスとファイル名を渡してFileオブジェクトを生成します。
そのFileオブジェクトを元にBitmapを取得しそれをDrawableに変換して表示します。

いざ実践

4つほど行った店を登録してリストを表示してみます。

DBとストレージは以下のような状態。
大戸屋だけ、画像を登録していません。

4行目が大戸屋のデータですが、visited_photoに"no_image"の文字列が登録されています。

内部ストレージの画像は3枚だけです。
(ドリアとハンバーガーと餃子の写真)


その状態で行った店リストを表示すると、以下のように表示されました。

保存された画像がある場合はそれが表示され、大戸屋は画像がないのでNoImageが表示されていますね!

CoilGlideなどのライブラリを使った画像読み込み方法もあるみたいなので今度試してみたいです。

今日はこの辺で!ではまた!