#2 Kotlin で TODO アプリを開発・リリースするまでの記録

# 前回のあらすじ
### 前回の記事
[#1 Kotlin で TODO アプリを開発・リリースするまでの記録](https://qiita.com/m_n_r/items/03ac9f641f735ad40d43)

### 前回のあらすじ
- 開発環境構築ができた
- リスト表示に RecyclerView を使う必要があることが分かった

### 今回の目標
- 引き続き実装に必要な下調べを行う

# RecyclerView でリストを書いてみる
- [RecyclerView の使い方。ドラッグ&ドロップで並び替え、スワイプで削除する。【Android】](https://negichou.com/recyclerview-and-itemtouchhelper-sample/)
- [RecyclerViewでドラッグアンドドロップの移動とスワイプの削除](https://qiita.com/naoi/items/f8004f906db16d6b38da)

前回の記事でも引用していた、RecyclerView を使用した記事です。
こちらを参考に書いてみるって思うでしょ？理解できないからむりです。
さて、困りました。
RecyclerView の実装方法から改めて調べてみます。

### RecyclerView の使い方を調べる

このような記事を見つけました。

> [[Android] RecyclerView の基本的な設定](https://akira-watson.com/android/recyclerview.html)
> 最初にRecyclerViewのライブラリーをbuild.gradleに追加しないといけません
> バージョンが異なると他との整合が取れずにエラーかワーニングにあることがありますので、使っている環境に合わせる必要があります（つまり簡単にコピペするだけだとハマります）

- RecyclerView を使うにはライブラリを追加しなければならない
- **コピペするとはまる**

自分の環境にあったライブラリの追加方法は、引用記事内にあるのでご確認ください。
とにかくこれを心とメモに留めておきます。

### どんどん調べていく
いろんな記事を見たので、メモ代わりに感想を付け加えていきます。
この段階ではソースコードを書いて動かすことはしていません。
難しかったので、簡単な記事を追い求めて、いろんな記事を見ました。
詳しいことは詳しい方が記事の中で詳しく書いてくださっているので読んでください。

#### [RecyclerViewを使ってSimple List Itemのような表示をするまで](http://ryut2208.hatenablog.com/entry/recyclerview_show)

> RecyclerViewを表示するためにはcom.android.support:designライブラリをインポートする必要があります。

**なんか早速言ってること違うじゃん・・・。**
さっきは RecyclerView のライブラリをインポートすると言っていましたが、これは両方インポートすべきであり、わかる前提で記載が省かれているのでしょうか？
（後々この理由もわかったので、いずれ記事内で触れたいと思います）

> RecyclerViewを表示するには次の3つを実装する必要があります。

> - Adapter
> - ViewHolder
> - セルのレイアウト

ListView にはありますが、RecyclerView にはないので自分で実装しなければならないという、例のあれだと思われます。

#### [AndroidのRecyclerViewについて(最初の最初)](http://python-newbie.hatenablog.com/entry/2018/10/21/150530)

> RecyclerViewを実装するのに必要な部品は

> - xml(RecyclerView)
> - xml(itemView)
> - Activity or Fragment
> - Adapter
> - dataModel
> - viewHolder

xml が 2 種類あるのはおそらく、Main とセル（item）で分かれているのだろうと推察できます。
Fragment？よくわからないので飛ばします。
dataModel はおそらく [ViewModel](https://qiita.com/homyu/items/046c9a43b15b9e376198) として使うものでしょう。いずれ向き合う必要がありますが、いったん忘れます。
Adapter と ViewHolder は前述の記事にもありましたね。

#### [Kotlin RecyclerView 一覧画面の並び替えでデータと画面の同期をとるならnotify系メソッドの呼び出しが必要。](https://qiita.com/tanaka5750/items/64e3a490954b8c3e2392)

> ポイントはドラッグ＆ドロップのイベント処理でデータを並び替えしたときに、データと画面の同期をとるならnotify系メソッドの呼び出しが必要ということです。

**なんだって？**
データと画面の同期をとるなら、notify系のメソッドを呼び出す必要があるらしいです。
今まで特に気にしていませんでしたが、あったのでしょうか・・・。

> RecyclerViewはデータの並び替えはせず、画面のみ並び替えのみが基本なのかも。

次回アプリ起動時に、変更した並び順が変わっていたら困ります。
逆に変わらないのであれば、データベースに並び替え順を保存せずによくなりますが、そんな都合のいいことがあるのでしょうか。なさそう。

- Adapter
- ViewHolder
- セルのレイアウト

この辺りは変わらず必要そうです。


### [RecyclerViewと仲良くなる](http://bigbuddha.hatenablog.jp/entry/recyclerview-beginner)
仲良くなりたい。
> RecyclerView単体もあるが、TextInputLayoutだったりSnackbarを使いたかったので
> `implementation 'com.android.support:design:27.1.1'`

前述でインポートすべきライブラリと違っていた謎が解けました！
それからどちらのライブラリも使えるようですね。よかったよかった。

> notifyDataSetChanged()を忘れると更新されないので注意(これ結構やられる)

notify系メソッドが出てきました。更新時には必要なことを覚えましたよ！

- Adapter
- ViewHolder
- セルのレイアウト

変わらずいるようなので、次から飛ばします。

### [KotlinでRecyclerViewを使ったリスト表示を行う](https://qiita.com/Todate/items/297bc3e4d0f3d2477ed3)

> CardViewとRecyclerViewを使う準備

CardView・・・？これまでに出てきてましたっけ？
どうやら、セルのレイアウトに CardView を使用しているようです。
引用記事内にあるアプリのプレビューキャプチャを見るに、たしかにリストというよりカードが並んでいる雰囲気があります。
セルのレイアウトは結構自由にカスタマイズできるようですね！

### [[Android]RecyclerViewを使ってListViewを作る](http://www.fineblue206.net/20190531203454)

めちゃくちゃ丁寧に説明してくださっていて、記事を引用しだすと範囲が広くなりすぎるので、引用は控えます。
記事を直接ご確認ください。
ただ言語は Java で書かれているようです・・・。
Java と Kotlin の互換性は 100 %と効いていますが、どこまで使えるんでしょう？
ちょっと試したいものです。

# データの保存方法
実装になかなか移らなくて申し訳ありませんが、調べれば調べるほどいろんな疑問が湧いてきたので、徹底的に下調べしてやろうという気分に陥っています。

最初の疑問は、Android のデータはどうやって保存するのか、です。

### Android のデータはどうやって保存するのか
iOS 開発をしている友人に、アプリのデータ保存について尋ねてみました。

友人「iOS では **Relam** というのがあって、使ってみたいと思ってるよ」
友人「Android を調べてたら **Room** っていうのもよく使われているみたい」

Android のことまで調べてくれちゃいました。さすが友人です。
これらはデータベースで、iOS には別にローカルでデータを保存する方法もあるそうです。
選ぶ根拠としては、**一番簡単そうなのにしますね。**

> [ストレージ オプション](https://developer.android.com/guide/topics/data/data-storage)

> - 共有の環境設定  
> キーと値のペアでプリミティブ データを保存します。
> - 内部ストレージ  
> 端末のメモリにプライベート データを保存します。
> - 外部ストレージ  
> 共有外部ストレージにパブリック データを保存します。
> - SQLite データベース  
> プライベート データベースに構造化データを保存します。
> - ネットワーク接続  
> 独自のネットワーク サーバーを使用してウェブにデータを保存します。

公式を確認してみました。いっぱいある。
Realm と Room も簡単に調べたところ、これらは「SQLite データベース」に該当するようです。
また、ほかに気になった「内部ストレージ」「外部ストレージ」は次の通り。

- 「内部ストレージ」はアプリ単一のプライベートファイルで、他のアプリはアクセス不可
- 「外部ストレージ」に保存されたファイルは読み取り / 書き込み / 削除可能

一長一短あるようですが、いずれも使う理由にも使わない理由にもなりません。
また、どれが簡単なのかもわかりません。

決めるのはまた今度にしますね。

# RecyclerView と CardView
データベースから逃げ出したところで、RecyclerView を調べている際に出てきた CardView が気になりだします。

- [CardViewをアプリに導入する](https://qiita.com/briete/items/b7ee295977be16f97c58)
- [CardViewの基本的な使い方とRecyclerViewとの合わせ技](https://qiita.com/yukiyamadajp/items/ec8b6c1ff0c9d74c2a53)

> RecyclerViewと一緒に用いることでCordinatorLayoutと一緒に使ってマテリアールなUIでの実装ができますし、そこにCardViewを組み合わせればどんどんモダンっぽいアプリになるのではないでしょうか。

モダンなアプリになるそうです。採用したい欲がもりもりです。
とはいえ、実装時に使い勝手が悪ければ元も子もないので、使えそうなら使うことにしましょう。

そしてどうやら、**CardView もライブラリとしてインポートする必要があるようです。**

# まとめ
今回はここまでです。
尻切れ蜻蛉で申し訳ないですが、話が長くなりそうだったのでいったん切りました。
RecyclerView に続いて CardView もライブラリとしてインポートする必要があるようで、ライブラリが気になりだしました。
次回はライブラリを調べるところから始めます。
**おそろしいことに開発にはまだしばらく着手しませんよ。**

### 成果
- RecyclerView に必要なものがなんとなくわかった
- CardView を使いたい欲がもりもり

### 参考記事に感謝
たくさんの記事を引用させて頂きました。ありがとうございます。
著者が一部のみを引用したことにより、引用元の意図しない情報として受けられることがないよう、できれば引用記事を読んでいただけますようお願いいたします。
またいずれの記事の感想も、著者個人の意見に基づくものですのでご注意ください。

# 次の記事

[#3 Kotlin で TODO アプリを開発・リリースするまでの記録](https://qiita.com/m_n_r/items/d3f15df9b0f4974b3dc5)