インターンシップで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の更新の挙動がおかしくなっていた。
学んだこと
宣言時の修飾子はちゃんと確認しましょう(震え声)