回答編集履歴

2 Executorを渡すサンプルを追加

kakajika

kakajika score 2871

2018/06/15 14:19  投稿

DataSourceを自分で実装すればよいと思います。
```kotlin
// コード例(特に言語の指定がなかったのでKotlinです)
class ListDataSource(private val items: List<Item>) : PositionalDataSource<Item>() {
   override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Item>) {
       callback.onResult(items, 0, items.size)
   }
   override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Item>) {
       val start = params.startPosition
       val end = params.startPosition + params.loadSize
       callback.onResult(items.subList(start, end))
   }
}
```
あとは、普通にPagedList.Builderの引数に渡してあげればOKです。
(追記: Executorが必要とのことだったので足しました)  
```kotlin
val list: List<Item> = ...
val pagedList = PagedList.Builder(ListDataSource(list), ...)
   .setNotifyExecutor(UiThreadExecutor())  
   .setFetchExecutor(AsyncTask.THREAD_POOL_EXECUTOR)  
   ...
   .build()
 
// UiThreadExecutorの実装例  
class UiThreadExecutor : Executor {  
   private val handler = Handler(Looper.getMainLooper())  
 
   override fun execute(command: Runnable) {  
       handler.post(command)  
   }  
}  
```
より汎用的なものにしたいならこんな感じで。
```kotlin
class ListDataSource<T>(private val items: List<T>) : PositionalDataSource<T>() {
   override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<T>) {
       callback.onResult(items, 0, items.size)
   }
   override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<T>) {
       val start = params.startPosition
       val end = params.startPosition + params.loadSize
       callback.onResult(items.subList(start, end))
   }
}
```
1 ジェネリクス版の追加

kakajika

kakajika score 2871

2018/06/14 16:18  投稿

DataSourceを自分で実装すればよいと思います。
```kotlin
// コード例(特に言語の指定がなかったのでKotlinです)
class ListDataSource(private val items: List<Item>) : PositionalDataSource<Item>() {
   override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<Item>) {
       callback.onResult(items, 0, items.size)
   }
   override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<Item>) {
       val start = params.startPosition
       val end = params.startPosition + params.loadSize
       callback.onResult(items.subList(start, end))
   }
}
```
あとは、普通にPagedList.Builderの引数に渡してあげればOKです。
```kotlin
val list: List<Item> = ...
val pagedList = PagedList.Builder(ListDataSource(list), ...)
   ...
   .build()
```  
 
より汎用的なものにしたいならこんな感じで。  
 
```kotlin  
class ListDataSource<T>(private val items: List<T>) : PositionalDataSource<T>() {  
   override fun loadInitial(params: LoadInitialParams, callback: LoadInitialCallback<T>) {  
       callback.onResult(items, 0, items.size)  
   }  
   override fun loadRange(params: LoadRangeParams, callback: LoadRangeCallback<T>) {  
       val start = params.startPosition  
       val end = params.startPosition + params.loadSize  
       callback.onResult(items.subList(start, end))  
   }  
}  
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る