40
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ListAdapterを使用してRecyclerViewの更新を簡単に行う

Last updated at Posted at 2018-02-11

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)のインスタンスを設定する
    • AsyncDifferConfigDiffUtil.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 にアップしてます。

40
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?