6

listView を使用したアクティビティがあり、クリックすると各項目を展開して mapView を表示できます。別の項目をクリックすると、開いている項目が閉じます。アクティビティは MapActivity を拡張し、mapview のインスタンスは 1 つしかありません。必要に応じて、次のように削除して項目に追加します。

private MapView getMapView() {
    if (mMapView == null) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mMapView = (MapView) inflater.inflate(R.layout.club_map,null);
    }
    else
    {
        ((ViewGroup) mMapView.getParent()).removeView(mMapView);
    }
    return mMapView;
}

private void attachMap(View targetView,String siteID) {
    if (openInPrgrs) {
        return;
    }
    RelativeLayout relView = (RelativeLayout) targetView.findViewById(R.id.clubDetailsLayout);
    LinearLayout mapContainer = (LinearLayout) relView.findViewById(R.id.mapContainer);
    UtilFunctions.logIfDebug("MembershipsList","Attaching Map. siteID " + siteID + " childCount = " + mapContainer.getChildCount());
    if (mapContainer.getChildCount() > 0 ) {
        return;
    }
    MapView mapView = getMapView();
    mapContainer.addView(mapView);
}

ほとんどの場合は問題なく動作しますが、画面がオフになってから再びオンになるか、開いているアイテムが画面からスクロールされて戻ってくると、mapView が消えます。これは、ビューが listView によってリサイクルされているためです。getView() でマップをアタッチしようとすると (ビューが開いている場合):

public View getView(int position, View convertView,
                ViewGroup parent) {

            final View resultView = super.getView(position, convertView, parent);
            LayoutParams lp = resultView.getLayoutParams();
            if (curOpenPos == position) {

                LinearLayout mapContainer = (LinearLayout) resultView.findViewById(R.id.mapContainer);
                lp.height = item_height_open;
                attachMap(resultView, siteID);
            }

アイテムが完全に展開されるとマップは消えますが、画面が消えてオンになると表示されます。

なぜこれが起こるのか、またはそれを解決するために私に何ができるか知っている人はいますか?

4

1 に答える 1

1

多分あなたはHolderクラスを実装することができます。1つは、MapViewのインスタンスを保持して、復元できるようにするものです。

最後の例では、他のビューでそれを行う方法をここに示します。

于 2012-07-23T19:01:04.533 に答える