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