LoginSignup
1
1

More than 5 years have passed since last update.

Android RecyclerView.AdapterのonBindViewHolderでpositionが0で返ってきてしまう

Posted at

概要

RecyclerView.Adapterでlistとbindして、bindしたデータに更新があった際にUIも更新する。という仕様の実装をしているとき ※1
listの0番目のデータが更新されたときには0番目が正しく更新されるが、1番目や2番目を更新した際も0番目が更新されてしまう。という事象が起きてしまった。

その原因と対処法を以下に示す。

※1.例えば、メールの一覧を表示して、一覧の中のセルに含まれるお気に入りボタンを押下した際、UIでお気に入りボタンの色を変える、など

原因

原因はlistのデータ更新をUIに反映するために、 notifyDataSetChanged() していたことだった。
本来、このメソッドはすべてのデータを更新するときや、RecyclerViewを初めて表示する際に使うが、listに含まれる複数件のうちの1件のUIの更新のときに呼び出すと、更新したデータの位置に問わず、onBindViewHolderにてpositionが0で返ってくるようだった。

対処法

1件のデータの更新の際は、 notifyItemChanged(int position) によって行う。
こうすることで適切なpositionが更新される

参考記事

以下の素晴らしい記事に助けられました。ありがとうございます!

RecyclerView.Adapterのnotify系メソッド 〜 notifyDataSetChangedで…いいの?

備考

UIのスクショとか貼ったほうが親切と思いつつ、業務で触っているときに気づいたので、スクショなどなしです。
不親切ですみません。
同じ事象で困った方が、日本語で検索した際に多少でも助けになれば幸いです。

1
1
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
1
1