質問: ArrayAdapterが上手く扱えず困っています。 位置情報を使ったアプリを制作しています。 ネット上にあるxmlデータを起動時に読み込んで、Item(自作クラス)に位置情報を含めた様々なデータを持たせています。 ネットからデータを非同期でロードするので、現在位置と取得タイミングがズレます。 なので、今のところ現在位置の取得が完了したタイミングで改めてItemが持っている位置情報との距離を計算し、Item.distanceにセットしています。 メインのViewはListViewで、各Viewに現在位置との距離(distance)を表示させていました。 これは自作ArrayAdapterクラスのgetViewで距離を計算してViewに貼り付ければ良かったので非常に楽だったのですが、次にこのItem.distanceをArrayに戻す必要が出てきました。 ネットからデータをロードした時点のArrayAdapter(各Itemのdistanceは空) →位置情報をロードして、距離を計算した後のArrayAdapter(各Itemのdistanceにデータが入っている) という状態にしたいのです。 ArrayListなら扱いが楽で 1.新しいArrayListを作る 2.元のデータをコピーしつつfor文等で手を加える とするだけでいいのですが、ArrayAdapterがどういう風にListを持っている(繋げている?)のかがよく分からず、操作が難しいです。 今のところadapter.clear();を使って全部消した上で、改めてlistViewにsetして上書きしています。 もっと簡単な方法があるよ!という方はよろしくお願いします。 そもそも位置情報と非同期のネット通信に対する扱いがおかしいよ!という方もお願いします。
回答: データ保持用のクラスを準備して、そこでアプリ起動時にArrayAdapterを初期化。 読み込むたびにデータをaddして、データが更新されていくように処理をしてく感じですかね。 利用するアダプタを共通で使いまわして、どこか任意でリセットすれば簡単に使いまわせる気がします。ListView側の更新は別にメソッドを準備して非同期が動いてる間は定期処理等にしておけばいいかと。 データを追加したり読み込んだりするたびにArrayAdapterを初期化してデータを入れなおすのは手間な気がします。 下記のようなクラスを準備していつも使いまわしてます。 一時的なデータ保持とかクラス間での変数の使いまわしには便利です。 ``` public class TextHolder { static TextHolder _instance; public ArrayList IdList = new ArrayList(); static public TextHolder newInstace() { // TODO 自動生成されたコンストラクター・スタブ if (_instance == null) { _instance = new TextHolder(); } return _instance; } public void putId(String id) { removeId(id); IdList.add(id); } public void removeId(String id) { for (int i = 0; i < IdList.size(); i++) { if (IdList.get(i).toString() == id) { IdList.remove(i); } } } ```