どくぴーの備忘録

真面目なことを書こうとするクソメガネのブログ。いつ投げ捨てられるのかは不明

【初歩的ミス】ListViewを更新しても挙動がおかしい【個人的メモ感あり】

インターンシップAndroidアプリを作ってるのですが、それで初歩的なミスでちょっとコケたので個人的メモも兼ねて。

何があったのか

MainActivity上でSQLiteとかから適当なクラス(ここではInfo)にまとめたデータをArrayListに引っ張ってきて、それをHashMapに落としこんで別のArrayListを作った後、FragmentにsetArgumentし、AdapterにしてListViewに渡すときのお話。
新しい要素を追加したり、既存の要素を変更した後、更新をかけると変更したはずの要素が変更されなかったり、何故か新しい要素にArrayListの先頭の要素が含まれていたりする。
アプリを一度終了させて再度起動させたり、デバックモードのUSB接続で再度実機で走らせたりすると表示は直るが、再度追加したりするとまた同じことになる。

例えば

"1","hoge","hogehoge"  
"2","fuga","fugafuga"  

という要素が格納されているとして、

"3","piyo","piyopiyo"    

という要素を追加すると、何故かこれは追加されずに

"1","hoge","hogehoge"  

が再び追加されている、と言うもの。


やったこと

Android ListView 更新」などで検索をかけたらなかなかに事例がある模様。
その中で一つ、目についたのをやってみた。

Adapterに変更通知をかけてみる

notifyDataSetChanged()メソッドでAdapterに変更を通知し、更新を促す。
しかし、これといった効果はなし。

更新時に逐一Adapter,HashMapなどを初期化する

効果なし。

いちいちToastさせて最初から何が格納されているか確認

ここで最初のArrayListの時点で格納されるデータがおかしいことに気づく。そしてこいつのデータを変更時に初期化すればいいのではと思い立つ。

ArrayListをclear()してからデータの格納を行ってみる

とりあえず挙動は期待通りのものに。しかしよく見てみると、何故かArrayListがstaticで宣言されている

clear()を排除してArrayListのstaticを外す

やはり期待通りの動作をする。原因判明。


原因

static宣言していたことで、ArrayListの更新の挙動がおかしくなっていた。

学んだこと

宣言時の修飾子はちゃんと確認しましょう(震え声)