Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1 of 30

AdapterToolboxでRecyclerViewを楽にする

3

Share

Download to read offline

2016/07/21のpotatotips #31 (iOS/Android開発Tips共有会)の発表資料です。

http://potatotips.connpass.com/event/34614/

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

AdapterToolboxでRecyclerViewを楽にする

  1. 1. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net AdapterToolboxで RecyclerViewを楽にする Takao Sumitomo @cattaka_net
  2. 2. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 自己紹介 ● 住友 孝郎(Takao Sumitomo) ● Androidアプリ開発者 ● 開発経歴 ● Androidアプリ ● iOSアプリ(ちょっとだけ) ● 業務系Webアプリケーション ● 業務系Windowsアプリ ● その他 ● 電子工作 ● OpenCV ● ウォンテッドリー株式会社所属 2014年12月〜
  3. 3. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net RecyclerViewを使ってます
  4. 4. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net RecyclerViewの中に 複数の「データ型」を入れたい
  5. 5. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net TwitterやFacebookの アプリもよくやってることです プロモーションのView ツイートのView
  6. 6. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net グロースやってるとユーザーさんも 使ってくれることが わかってます
  7. 7. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 解決したかった問題 ● 頻繁に表示する「データ型」を組み替えるのがしん どい ● しんどい作業はバグの元
  8. 8. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net RecyclerView.Adapter ● 役割 ● データ→ViewHolderの割り当て ● ViewHolderの生成 ● Viewの表示内容にデータをバインドする ● RecyclerView.Adapterを継承した クラスを作って実装する
  9. 9. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net RecyclerView.Adapterの 実装を見てみましょう
  10. 10. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net RecyclerView.Adapterの実装 public class HogeAdapter extends RecyclerView.Adapter { @Override public int getItemViewType(int position) { /* ここにデータ→ViewHolderの割り当てを書く */ } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /* ViewHolderの生成処理を書く */ } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { /* Viewの表示内容にデータをバインドする処理を書く */ } }
  11. 11. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 例:データ型が2個の場合 public class HogeAdapter extends RecyclerView.Adapter { @Override public int getItemViewType(int position) { /* ここにデータ→ViewHolderの割り当てを書く */ } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /* ViewHolderの生成処理を書く */ } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { /* Viewの表示内容にデータをバインドする処理を書く */ } } ←ここが2倍になる ←ここが2倍になる ←ここが2倍になる
  12. 12. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 例:データ型が3個の場合 public class HogeAdapter extends RecyclerView.Adapter { @Override public int getItemViewType(int position) { /* ここにデータ→ViewHolderの割り当てを書く */ } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /* ViewHolderの生成処理を書く */ } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { /* Viewの表示内容にデータをバインドする処理を書く */ } } ←ここが3倍になる ←ここが3倍になる ←ここが3倍になる
  13. 13. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 例:データ型がn個の場合 public class HogeAdapter extends RecyclerView.Adapter { @Override public int getItemViewType(int position) { /* ここにデータ→ViewHolderの割り当てを書く */ } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /* ViewHolderの生成処理を書く */ } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { /* Viewの表示内容にデータをバインドする処理を書く */ } } ←ここがn倍になる ←ここがn倍になる ←ここがn倍になる
  14. 14. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 辛くない?
  15. 15. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 複数の画面で部分的に共有したいとき 画面1用のAdapter データ型1についての実装 データ型2についての実装 データ型3についての実装 画面2用のAdapter データ型3についての実装 データ型4についての実装 コピペせざるを得ない、、、 画面1 画面2
  16. 16. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 辛くない?
  17. 17. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 複数の画面で部分的に共有したいとき 全画面の共通の神Adapter データ型1についての実装 データ型2についての実装 データ型3についての実装 データ型4についての実装 神Adapterを作る? 画面1 画面2
  18. 18. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 辛くない?
  19. 19. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net なんかさ
  20. 20. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net データ型 ViewHolderの生成 データをバインドする処理 ↑みたいなViewHolderに 専念するクラスを作って
  21. 21. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net それを束ねて使えたら嬉しくない? データ型1に専念するクラス データ型2に専念するクラス データ型3に専念するクラス データ型4に専念するクラス 束ねるAdapter 束ねるAdapter 画面1 画面2
  22. 22. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net という自分の声にお応えして ライブラリを作りました
  23. 23. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 『AdapterToolbox』
  24. 24. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 登場人物 ● ViewHolderFactory ● ScrambleAdapter データ型1用のViewHolderFactory データ型2用のViewHolderFactory データ型3用のViewHolderFactory データ型4用のViewHolderFactory ScrambleAdapter ScrambleAdapter 画面1 画面2
  25. 25. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 大雑把な使い方 ● ViewHolderFactoryを作る ● データが対応可能かの判定処理 ● ViewHolderの生成 ● Viewの表示内容にデータをバインドする ● 複数のViewHolderFactoryをScrambleAdapter にセットする ● List<Object>でデータを食わせる
  26. 26. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net 例 List<Object> “1” 0 First “5” 4 Second NumberViewHolderFactory StringViewHolderFactory QuantumViewHolderFactory
  27. 27. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net AdapterToolboxの他の機能 ● MergeRecyclerAdapter ● iOS的なセクション分けに威力を発揮する ● ヘッダーやフッターの実装も容易 ● リスナー周りの実装の簡略化の機構 ● Expandableなリスト用のAdapter
  28. 28. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net もっと他に良いアプローチがあれば ご意見聞かせて下さい
  29. 29. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net GitHubプロジェクト ● https://github.com/cattaka/AdapterToolbox ● サンプルプログラム付き ● RecyclerViewのJUnit付き ● https://www.youtube.com/watch?v=FSx8rZnBB0E
  30. 30. 2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net ご清聴ありがとうございました Takao Sumitomo @cattaka_net

×