SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
PAGING LIBRARYの基本について理解
してみた
ICHI-KATO
ABOUT ME
▸ 加藤一郎
▸ Kotlin歴:1年未満
▸ 趣味:キャンプ、旅行、社会人
バスケ
PAGING LIBRARY
PAGING LIBRARYとは
▸ Android Jetpack の一部
▸ アプリ内のRecyclerViewにおいて簡単にデータを徐々に読
み込むことができる
▸ DBのみ、ネットワークのみ、または両方に対応
主要なコンポーネント
▸ DataSource
▸ データのスナップショットを取得し、PagedListに渡す。
▸ PagedList
▸ DataSourceからデータをロードする。データの変更をRecyclerViewに教える。
▸ PagedListAdapter
▸ RecyclerView.Adapterを実装したクラス
▸ 新しいデータがロードされた時、PagedListAdapterはRecyclerViewにデータが来た事を教える
主要なコンポーネント
▸ LivePagedListBuilder
▸ DataSourceとBoundaryCallbackを指定し、LiveData<PagedList>を生成する。
▸ BoundaryCallback
▸ PagedListが利用可能なデータの終わりに達したときに通知する。
関係図
引用:https://codelabs.developers.google.com/codelabs/android-paging/index.html#2
サンプル
https://github.com/googlecodelabs/android-paging/tree/solution
ライブラリの追加
Build.gradle
implementation "androidx.paging:paging-runtime:$pagingVersion"
その他必要なライブラリ
// architecture components
implementation "androidx.lifecycle:lifecycle-extensions:$archComponentsVersion"
implementation "androidx.lifecycle:lifecycle-runtime:$archComponentsVersion"
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.lifecycle:lifecycle-compiler:$archComponentsVersion"
kapt "androidx.room:room-compiler:$roomVersion"
BOUNDARYCALLBACK
class RepoBoundaryCallback(
private val query: String,
private val service: GithubService,
private val cache: GithubLocalCache
) : PagedList.BoundaryCallback<Repo>() {
companion object {
private const val NETWORK_PAGE_SIZE = 50
}
override fun onZeroItemsLoaded() {
requestAndSaveData(query)
}
override fun onItemAtEndLoaded(itemAtEnd: Repo) {
requestAndSaveData(query)
}
private fun requestAndSaveData(query: String) {
// APIからデータを引いてDBに保存する
}
}
val boundaryCallback = RepoBoundaryCallback(query, service, githubLocalCache)
DATASOURCE
fun reposByName(name: String):
DataSource.Factory<Int,Repo> {
return repoDao.reposByName(query)
}
val dataSourceFactory : DataSource.Factory<Int,Repo>
= githubLocalCache.reposByName(query)
LIVEDATA>PAGEDLIST<の生成
val data : LiveData<PagedList<Repo>> =
LivePagedListBuilder(dataSourceFactory,DATABASE_PAGE_SIZE)
.setBoundaryCallback(boundaryCallback)
.build()
VIEWMODEL
class SearchRepositoriesViewModel(private val repository: GithubRepository) : ViewModel() {
private val queryLiveData = MutableLiveData<String>()
private val repoResult: LiveData<RepoSearchResult> = Transformations.map(queryLiveData) {
// LiveData<PagedList>の生成
repository.search(it)
}
val repos: LiveData<PagedList<Repo>> = Transformations.switchMap(repoResult) { it -> it.data }
fun searchRepo(queryString: String) {
queryLiveData.postValue(queryString)
}
fun lastQueryValue(): String? = queryLiveData.value
}
ADAPTER
class ReposAdapter : PagedListAdapter<Repo, RecyclerView.ViewHolder>(REPO_COMPARATOR) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return RepoViewHolder.create(parent)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val repoItem = getItem(position)
if (repoItem != null) {
(holder as RepoViewHolder).bind(repoItem)
}
}
companion object {
private val REPO_COMPARATOR = object : DiffUtil.ItemCallback<Repo>() {
override fun areItemsTheSame(oldItem: Repo, newItem: Repo): Boolean =
oldItem.fullName == newItem.fullName
override fun areContentsTheSame(oldItem: Repo, newItem: Repo): Boolean =
oldItem == newItem
}
}
}
ACTIVITY
private fun initAdapter() {
list.adapter = adapter
viewModel.repos.observe(this, Observer<PagedList<Repo>> {
adapter.submitList(it)
})
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProviders.of(this, Injection.provideViewModelFactory(this))
.get(SearchRepositoriesViewModel::class.java)
initAdapter()
viewModel.searchRepo(query)
}
感想
▸ いきなりみた時はコンポーネントが多くてちょっとよくわか
らなかったが、流れを掴めばすぐに使えるようになるはず
▸ Room、ViewModelなどのアーキテクチャ コンポーネント
を予めある程度わかるようにする必要がある
▸ テストをどうやって書いたら望ましいかは今模索中
参考
https://developer.android.com/topic/libraries/architecture/
paging/
https://codelabs.developers.google.com/codelabs/android-
paging/index.html
THANK YOU

Weitere ähnliche Inhalte

Was ist angesagt?

No-Ops で大量データ処理基盤を簡単に実現する
No-Ops で大量データ処理基盤を簡単に実現するNo-Ops で大量データ処理基盤を簡単に実現する
No-Ops で大量データ処理基盤を簡単に実現するKiyoshi Fukuda
 
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送Google Cloud Platform - Japan
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化Google Cloud Platform - Japan
 
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...Google Cloud Platform - Japan
 
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -KSK Analytics Inc.
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?Google Cloud Platform - Japan
 
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送Google Cloud Platform - Japan
 
[Cloud OnAir] ケーススタディから学ぶ GCP で行うデータ エンジニアリング 2019年6月6日 放送
[Cloud OnAir] ケーススタディから学ぶ  GCP で行うデータ エンジニアリング 2019年6月6日 放送[Cloud OnAir] ケーススタディから学ぶ  GCP で行うデータ エンジニアリング 2019年6月6日 放送
[Cloud OnAir] ケーススタディから学ぶ GCP で行うデータ エンジニアリング 2019年6月6日 放送Google Cloud Platform - Japan
 
Google BigQuery クエリの処理の流れ - #bq_sushi
Google BigQuery クエリの処理の流れ - #bq_sushi Google BigQuery クエリの処理の流れ - #bq_sushi
Google BigQuery クエリの処理の流れ - #bq_sushi Google Cloud Platform - Japan
 
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築するGoogle Cloud Platform - Japan
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールShinsuke Sugaya
 
Windows Azure HDInsight サービスの紹介
Windows Azure HDInsight サービスの紹介Windows Azure HDInsight サービスの紹介
Windows Azure HDInsight サービスの紹介Kuninobu SaSaki
 
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Appsグリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & AppsGoogle Cloud Platform - Japan
 
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送Google Cloud Platform - Japan
 

Was ist angesagt? (20)

Elasticsearch at Makuake
Elasticsearch at MakuakeElasticsearch at Makuake
Elasticsearch at Makuake
 
No-Ops で大量データ処理基盤を簡単に実現する
No-Ops で大量データ処理基盤を簡単に実現するNo-Ops で大量データ処理基盤を簡単に実現する
No-Ops で大量データ処理基盤を簡単に実現する
 
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送
[Cloud OnAir] BigQuery で実現する Smart Analytics Platform 2019年10月24日 放送
 
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送
[Cloud OnAir] BigQuery へデータを読み込む 2019年3月14日 放送
 
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
[Cloud OnAir] Google Workspace でできる データ分析と業務自動化のご紹介 2020年12月3日 放送
 
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
[Cloud OnAir] Google Cloud における RDBMS の運用パターン 2020年11月19日 放送
 
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化
Google Cloud ベストプラクティス:Google BigQuery 編 - 03 : パフォーマンスとコストの最適化
 
MySQL_Update_20191010
MySQL_Update_20191010MySQL_Update_20191010
MySQL_Update_20191010
 
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...
DeNA のデータ活用を支える BigQuery データの民主化とガバナンス強化の軌跡 | Google Cloud INSIDE Games & App...
 
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -
【KSKアナリティクス】 NYSOL 使い方 【後編】 オープンデータ 分析 - 頻出パターン の作成・可視化 -
 
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?
Google Cloud ベストプラクティス:Google BigQuery 編 - 01 : BigQuery とは?
 
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
[Cloud OnAir] Google Cloud へのマイグレーション ツールの紹介 2020年11月26日 放送
 
[Cloud OnAir] ケーススタディから学ぶ GCP で行うデータ エンジニアリング 2019年6月6日 放送
[Cloud OnAir] ケーススタディから学ぶ  GCP で行うデータ エンジニアリング 2019年6月6日 放送[Cloud OnAir] ケーススタディから学ぶ  GCP で行うデータ エンジニアリング 2019年6月6日 放送
[Cloud OnAir] ケーススタディから学ぶ GCP で行うデータ エンジニアリング 2019年6月6日 放送
 
Google BigQuery クエリの処理の流れ - #bq_sushi
Google BigQuery クエリの処理の流れ - #bq_sushi Google BigQuery クエリの処理の流れ - #bq_sushi
Google BigQuery クエリの処理の流れ - #bq_sushi
 
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する
[Cloud OnAir ] #03 No-ops で大量データ処理基盤を簡単に構築する
 
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch AuthプラグインでアクセスコントロールElasticsearch Authプラグインでアクセスコントロール
Elasticsearch Authプラグインでアクセスコントロール
 
Windows Azure HDInsight サービスの紹介
Windows Azure HDInsight サービスの紹介Windows Azure HDInsight サービスの紹介
Windows Azure HDInsight サービスの紹介
 
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Appsグリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
グリー株式会社『私たちが GCP を使い始めた本当の理由』第 9 回 Google Cloud INSIDE Game & Apps
 
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送[Cloud OnAir]   最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
[Cloud OnAir] 最新版 GCP ではじめる、サーバーレスアプリケーションの開発。 2018年11月8日 放送
 

Mehr von ichirokato5

ヤフーにおけるGoの一例紹介
ヤフーにおけるGoの一例紹介ヤフーにおけるGoの一例紹介
ヤフーにおけるGoの一例紹介ichirokato5
 
TDDの話と初めてのUIテスト
TDDの話と初めてのUIテストTDDの話と初めてのUIテスト
TDDの話と初めてのUIテストichirokato5
 
Androidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りAndroidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りichirokato5
 
ARCoreアプリを作ってみよう
ARCoreアプリを作ってみようARCoreアプリを作ってみよう
ARCoreアプリを作ってみようichirokato5
 
初めてMlKitを使ってみた
初めてMlKitを使ってみた初めてMlKitを使ってみた
初めてMlKitを使ってみたichirokato5
 

Mehr von ichirokato5 (6)

ヤフーにおけるGoの一例紹介
ヤフーにおけるGoの一例紹介ヤフーにおけるGoの一例紹介
ヤフーにおけるGoの一例紹介
 
TDDの話と初めてのUIテスト
TDDの話と初めてのUIテストTDDの話と初めてのUIテスト
TDDの話と初めてのUIテスト
 
Androidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返りAndroidエンジニアになってからの1年間の感想と振り返り
Androidエンジニアになってからの1年間の感想と振り返り
 
ARCoreアプリを作ってみよう
ARCoreアプリを作ってみようARCoreアプリを作ってみよう
ARCoreアプリを作ってみよう
 
Espresso
EspressoEspresso
Espresso
 
初めてMlKitを使ってみた
初めてMlKitを使ってみた初めてMlKitを使ってみた
初めてMlKitを使ってみた
 

Paging Libraryの基本的な使い方について