List.remove() が削除されないのはいつですか? ...でMapView
?
MapView
とを拡張するオーバーレイを持つアプリケーションがありますOverlay
。私のアプリケーションの特定のケースでは (ユーザーがオーバーレイを追加するものを検索し、検索をキャンセルした時点で、以下のコードを呼び出してオーバーレイを削除する必要があります)。
コード:
Log.e(TAG, "Map View Contains Overlay? " + mMapView.getOverlays().contains(mOverlay));
mMapView.getOverlays().remove(mOverlay);
Log.e(TAG, "Map View Contains Overlay? " + mMapView.getOverlays().contains(mOverlay));
mMapView.getOverlays().remove(mOverlay);
Log.e(TAG, "Map View Contains Overlay? " + mMapView.getOverlays().contains(mOverlay));
ログ:
03-07 14:05:43.737: E/SearchActivity(22445): Map View Contains Overlay? true
03-07 14:05:43.737: E/SearchActivity(22445): Map View Contains Overlay? true
03-07 14:05:43.737: E/SearchActivity(22445): Map View Contains Overlay? false
ノート:
mMapView
のインスタンスですcom.google.android.maps.MapView
mOverlay
.equals()
私が書いたカスタムクラスのインスタンスです(触れたり.hashCode()
拡張したりしませんcom.google.android.maps.Overlay
この時点でmOverlay
は削除されていますが、削除するのに 2 回の呼び出しが必要だったのはなぜですか? 私は何を誤解していますか?
解決:
なんらかの理由で私はメンタルブロックを抱えていて、List
オーバーレイがリスト内に各タイプのレイアウトを1つ持つという私のビジネスロジックを強制するだろうと思いました。そうではないことがわかりました。 MapView
s は、同じインスタンスの 2 つを含め、同じオーバーレイのインスタンスを好きなだけ持つことができます (メモリの問題を除く)。そのため、同じインスタンスの 2 つをオーバーレイに追加すると、List
. 2回のremove
通話が必要です。