2018/03/03更新
※この記事はSupport Library 27.1.0 時点のものになります。
(Paging Library 1.0.0-alpha5 でサポートされていたListAdapter
はSupport Library27.1.0でサポートされるようになり、Paging Library 1.0.0-alpha6 で削除されました。
https://developer.android.com/topic/libraries/architecture/release-notes.html#february_27_2018)
ListAdapter とは
ListAdapter
とは Support Library 27.1.0で提供される RecyclerView.Adapter
を継承したクラスとなっており、以下のような特徴があります。
- RecyclerView に表示するアイテムの更新は
submitList()
メソッドを使用してリストをセットする -
submitList()
メソッドが呼び出されると内部ではバックグラウンドスレッドで DiffUtil.calculateDiff() メソッドが呼び出される - コンストラクタで DiffUtil.ItemCallback (もしくは AsyncDifferConfig)のインスタンスを設定する
-
AsyncDifferConfig
はDiffUtil.ItemCallback
& バックグラウンドスレッド用の Executor & メインスレッド用の Executor を設定できる
-
ListAdapter の使い方
使い方は非常に簡単で、単に RecyclerView の Adapter にこの ListAdapter
を使用すればよいです。
ただ、コンストラクタで DiffUtil.ItemCallback
のインスタンスを渡す必要があります。
内部で DiffUtil が使用されているので、更新時のアニメーションももちろんサポートされています。
private val ITEM_CALLBACK = object : DiffUtil.ItemCallback<User>() {
override fun areItemsTheSame(oldItem: User, newItem: User): Boolean = oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: User, newItem: User): Boolean = oldItem == newItem
}
internal class UserAdapter : ListAdapter<User, UserViewHolder>(ITEM_CALLBACK) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = UserViewHolder(parent)
override fun onBindViewHolder(holder: UserViewHolder, position: Int) =
holder.bind(getItem(position))
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adapter.submitList(users)
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.adapter = adapter
recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
findViewById<Button>(R.id.button).setOnClickListener {
adapter.submitList(users.shuffled())
}
}
}
サンプルプロジェクト を Github にアップしてます。