SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
AdapterToolboxで
RecyclerViewを楽にする
Takao Sumitomo
@cattaka_net
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
自己紹介
● 住友 孝郎(Takao Sumitomo)
● Androidアプリ開発者
● 開発経歴
● Androidアプリ
● iOSアプリ(ちょっとだけ)
● 業務系Webアプリケーション
● 業務系Windowsアプリ
● その他
● 電子工作
● OpenCV
● ウォンテッドリー株式会社所属
2014年12月〜
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
RecyclerViewを使ってます
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
RecyclerViewの中に
複数の「データ型」を入れたい
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
TwitterやFacebookの
アプリもよくやってることです
プロモーションのView
ツイートのView
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
グロースやってるとユーザーさんも
使ってくれることが
わかってます
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
解決したかった問題
● 頻繁に表示する「データ型」を組み替えるのがしん
どい
● しんどい作業はバグの元
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
RecyclerView.Adapter
● 役割
● データ→ViewHolderの割り当て
● ViewHolderの生成
● Viewの表示内容にデータをバインドする
● RecyclerView.Adapterを継承した
クラスを作って実装する
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
RecyclerView.Adapterの
実装を見てみましょう
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の表示内容にデータをバインドする処理を書く */
}
}
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倍になる
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倍になる
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倍になる
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
辛くない?
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
複数の画面で部分的に共有したいとき
画面1用のAdapter
データ型1についての実装
データ型2についての実装
データ型3についての実装
画面2用のAdapter
データ型3についての実装
データ型4についての実装
コピペせざるを得ない、、、
画面1 画面2
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
辛くない?
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
複数の画面で部分的に共有したいとき
全画面の共通の神Adapter
データ型1についての実装
データ型2についての実装
データ型3についての実装
データ型4についての実装
神Adapterを作る?
画面1 画面2
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
辛くない?
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
なんかさ
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
データ型
ViewHolderの生成
データをバインドする処理
↑みたいなViewHolderに
専念するクラスを作って
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
それを束ねて使えたら嬉しくない?
データ型1に専念するクラス
データ型2に専念するクラス
データ型3に専念するクラス
データ型4に専念するクラス
束ねるAdapter
束ねるAdapter
画面1
画面2
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
という自分の声にお応えして
ライブラリを作りました
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
『AdapterToolbox』
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
登場人物
● ViewHolderFactory
● ScrambleAdapter
データ型1用のViewHolderFactory
データ型2用のViewHolderFactory
データ型3用のViewHolderFactory
データ型4用のViewHolderFactory
ScrambleAdapter
ScrambleAdapter
画面1
画面2
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
大雑把な使い方
● ViewHolderFactoryを作る
● データが対応可能かの判定処理
● ViewHolderの生成
● Viewの表示内容にデータをバインドする
● 複数のViewHolderFactoryをScrambleAdapter
にセットする
● List<Object>でデータを食わせる
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
例
List<Object>
“1”
0
First
“5”
4
Second
NumberViewHolderFactory
StringViewHolderFactory
QuantumViewHolderFactory
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
AdapterToolboxの他の機能
● MergeRecyclerAdapter
● iOS的なセクション分けに威力を発揮する
● ヘッダーやフッターの実装も容易
● リスナー周りの実装の簡略化の機構
● Expandableなリスト用のAdapter
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
もっと他に良いアプローチがあれば
ご意見聞かせて下さい
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
2016/07/21 potatotips #31 (iOS/Android開発Tips共有会) @cattaka_net
ご清聴ありがとうございました
Takao Sumitomo
@cattaka_net

Más contenido relacionado

Similar a AdapterToolboxでRecyclerViewを楽にする

Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Yuki Higuchi
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Yuki Higuchi
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
日本Androidの会 中国支部資料
日本Androidの会 中国支部資料日本Androidの会 中国支部資料
日本Androidの会 中国支部資料Masafumi Terazono
 
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピックcm_saito
 
Android Hacks - 合宿インテント
Android Hacks - 合宿インテントAndroid Hacks - 合宿インテント
Android Hacks - 合宿インテントMasanori Ohkawara
 
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~Hideki Takase
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くTakao Sumitomo
 
Androidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかするAndroidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかするKoji MATSUBARA
 
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...Nobuhiro Nakajima
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までYuki Tanabe
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力Keiji Ariyama
 
[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-DeviceKenichi Kambara
 
Azure の App Center でアプリの 使用状況を分析する
Azure の App Center でアプリの 使用状況を分析するAzure の App Center でアプリの 使用状況を分析する
Azure の App Center でアプリの 使用状況を分析するYusuke Kojima
 
3分で実装完了!エッジ AI デモ
3分で実装完了!エッジ AI デモ3分で実装完了!エッジ AI デモ
3分で実装完了!エッジ AI デモTomoyuki Sugita
 
Google mapとgps機能を使ってみた。
Google mapとgps機能を使ってみた。Google mapとgps機能を使ってみた。
Google mapとgps機能を使ってみた。Eiichi Tsuru
 

Similar a AdapterToolboxでRecyclerViewを楽にする (20)

Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.Android Lecture #01 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
日本Androidの会 中国支部資料
日本Androidの会 中国支部資料日本Androidの会 中国支部資料
日本Androidの会 中国支部資料
 
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック
#cmdevio2016 (レポート: F-2) iOS × Android 並行開発についてのトピック
 
Android Hacks - 合宿インテント
Android Hacks - 合宿インテントAndroid Hacks - 合宿インテント
Android Hacks - 合宿インテント
 
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~
IoTアプリ/ロボット開発をリアルタイムOSでレベルアップしませんか? ~高品質な組込み向けオープンソースを開発するTOPPERSプロジェクトのご紹介~
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
 
SQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗くSQLiteDatabaseを無理矢理覗く
SQLiteDatabaseを無理矢理覗く
 
Androidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかするAndroidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかする
 
第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo
 
Android Hacks - Hack8
Android Hacks - Hack8Android Hacks - Hack8
Android Hacks - Hack8
 
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
Google Dev Fest 2010 Japan LT: OpenSocial JavaScript API is good, Lightweight...
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device[DevSummit2013S]Android_Multi-Version_Multi-Device
[DevSummit2013S]Android_Multi-Version_Multi-Device
 
Azure の App Center でアプリの 使用状況を分析する
Azure の App Center でアプリの 使用状況を分析するAzure の App Center でアプリの 使用状況を分析する
Azure の App Center でアプリの 使用状況を分析する
 
3分で実装完了!エッジ AI デモ
3分で実装完了!エッジ AI デモ3分で実装完了!エッジ AI デモ
3分で実装完了!エッジ AI デモ
 
Google mapとgps機能を使ってみた。
Google mapとgps機能を使ってみた。Google mapとgps機能を使ってみた。
Google mapとgps機能を使ってみた。
 

Más de Takao Sumitomo

僕は上スワイプでBottomSheetを出したかっただけなんだ
僕は上スワイプでBottomSheetを出したかっただけなんだ僕は上スワイプでBottomSheetを出したかっただけなんだ
僕は上スワイプでBottomSheetを出したかっただけなんだTakao Sumitomo
 
sharedUserIdを使った俺得開発ツールの作り方
sharedUserIdを使った俺得開発ツールの作り方sharedUserIdを使った俺得開発ツールの作り方
sharedUserIdを使った俺得開発ツールの作り方Takao Sumitomo
 
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話CIのビルドを通知する仕組みをAndroidとFirestoreで作った話
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話Takao Sumitomo
 
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンドCamera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンドTakao Sumitomo
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
高速でトライ&エラーを するために気をつけてること
高速でトライ&エラーを するために気をつけてること高速でトライ&エラーを するために気をつけてること
高速でトライ&エラーを するために気をつけてることTakao Sumitomo
 
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきた
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきたMaker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきた
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきたTakao Sumitomo
 
Viewを動的に変化させるアプローチ
Viewを動的に変化させるアプローチViewを動的に変化させるアプローチ
Viewを動的に変化させるアプローチTakao Sumitomo
 
プロダクトを育てるのにGoogleのサービスが助けてくれること
プロダクトを育てるのにGoogleのサービスが助けてくれることプロダクトを育てるのにGoogleのサービスが助けてくれること
プロダクトを育てるのにGoogleのサービスが助けてくれることTakao Sumitomo
 
エンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったことエンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったことTakao Sumitomo
 
Wantedlyのテスト事情
Wantedlyのテスト事情Wantedlyのテスト事情
Wantedlyのテスト事情Takao Sumitomo
 
用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法Takao Sumitomo
 
potatotips (iOS/Android開発Tips共有会) 第19回 資料
potatotips (iOS/Android開発Tips共有会) 第19回 資料potatotips (iOS/Android開発Tips共有会) 第19回 資料
potatotips (iOS/Android開発Tips共有会) 第19回 資料Takao Sumitomo
 
開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程Takao Sumitomo
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜Takao Sumitomo
 
勉強会資料 データ構造とアルゴリズム
勉強会資料 データ構造とアルゴリズム勉強会資料 データ構造とアルゴリズム
勉強会資料 データ構造とアルゴリズムTakao Sumitomo
 
勉強会資料 Uml概要
勉強会資料 Uml概要勉強会資料 Uml概要
勉強会資料 Uml概要Takao Sumitomo
 
Firefox OSの何が嬉しいか
Firefox OSの何が嬉しいかFirefox OSの何が嬉しいか
Firefox OSの何が嬉しいかTakao Sumitomo
 
HTML5でFirefox OSアプリを作ろう
HTML5でFirefox OSアプリを作ろうHTML5でFirefox OSアプリを作ろう
HTML5でFirefox OSアプリを作ろうTakao Sumitomo
 

Más de Takao Sumitomo (20)

僕は上スワイプでBottomSheetを出したかっただけなんだ
僕は上スワイプでBottomSheetを出したかっただけなんだ僕は上スワイプでBottomSheetを出したかっただけなんだ
僕は上スワイプでBottomSheetを出したかっただけなんだ
 
sharedUserIdを使った俺得開発ツールの作り方
sharedUserIdを使った俺得開発ツールの作り方sharedUserIdを使った俺得開発ツールの作り方
sharedUserIdを使った俺得開発ツールの作り方
 
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話CIのビルドを通知する仕組みをAndroidとFirestoreで作った話
CIのビルドを通知する仕組みをAndroidとFirestoreで作った話
 
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンドCamera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド
Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
 
高速でトライ&エラーを するために気をつけてること
高速でトライ&エラーを するために気をつけてること高速でトライ&エラーを するために気をつけてること
高速でトライ&エラーを するために気をつけてること
 
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきた
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきたMaker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきた
Maker Faire Bay Areaに行きたかったのでGoogle I/Oに行ってきた
 
Viewを動的に変化させるアプローチ
Viewを動的に変化させるアプローチViewを動的に変化させるアプローチ
Viewを動的に変化させるアプローチ
 
プロダクトを育てるのにGoogleのサービスが助けてくれること
プロダクトを育てるのにGoogleのサービスが助けてくれることプロダクトを育てるのにGoogleのサービスが助けてくれること
プロダクトを育てるのにGoogleのサービスが助けてくれること
 
エンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったことエンジニアがプロダクト育成を始めるまでにやったこと
エンジニアがプロダクト育成を始めるまでにやったこと
 
Wantedlyのテスト事情
Wantedlyのテスト事情Wantedlyのテスト事情
Wantedlyのテスト事情
 
用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法
 
Uml速習会
Uml速習会Uml速習会
Uml速習会
 
potatotips (iOS/Android開発Tips共有会) 第19回 資料
potatotips (iOS/Android開発Tips共有会) 第19回 資料potatotips (iOS/Android開発Tips共有会) 第19回 資料
potatotips (iOS/Android開発Tips共有会) 第19回 資料
 
開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜
 
勉強会資料 データ構造とアルゴリズム
勉強会資料 データ構造とアルゴリズム勉強会資料 データ構造とアルゴリズム
勉強会資料 データ構造とアルゴリズム
 
勉強会資料 Uml概要
勉強会資料 Uml概要勉強会資料 Uml概要
勉強会資料 Uml概要
 
Firefox OSの何が嬉しいか
Firefox OSの何が嬉しいかFirefox OSの何が嬉しいか
Firefox OSの何が嬉しいか
 
HTML5でFirefox OSアプリを作ろう
HTML5でFirefox OSアプリを作ろうHTML5でFirefox OSアプリを作ろう
HTML5でFirefox OSアプリを作ろう
 

AdapterToolboxでRecyclerViewを楽にする

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