Dynamiczna zawartość w Maps v2 InfoWindow

Chcę pokazać InfoWindow na znacznikach we fragmencie Maps V2. Chodzi o to, że chcę pokazać bitmapy, które są dynamicznie ładowane z sieci za pomocą Universal Image Downloader.

To jest mój InfoWindowAdapter:

class MyInfoWindowAdapter implements InfoWindowAdapter {

    private final View v;

    MyInfoWindowAdapter() {
        v = getLayoutInflater().inflate(R.layout.infowindow_map,
                null);
    }

    @Override
    public View getInfoContents(Marker marker) {



        Item i = items.get(marker.getId());

        TextView tv1 = (TextView) v.findViewById(R.id.textView1);
        ImageView iv = (ImageView) v.findViewById(R.id.imageView1);
        tv1.setText(i.getTitle());


        DisplayImageOptions options = new DisplayImageOptions.Builder()
                .delayBeforeLoading(5000).build();

        imageLoader.getMemoryCache(); 

        imageLoader.displayImage(i.getThumbnailUrl(), iv, options,
                new ImageLoadingListener() {

                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                            FailReason failReason) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onLoadingComplete(String imageUri,
                            View view, Bitmap loadedImage) {
                        Log.d("MAP", "Image loaded " + imageUri);

                    }

                    @Override
                    public void onLoadingCancelled(String imageUri,
                            View view) {
                        // TODO Auto-generated method stub

                    }
    });

        return v;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        // TODO Auto-generated method stub
        return null;
    }

}

Mam z tym 2 problemy:

Jak wiemy InfoWindow jest rysowane i późniejsze zmiany w nim (w moim przypadku Nowy BitMap na ImageView) nie są wyświetlane/ InfoWindow nie jest aktualizowany. Jak mogę "powiadomić" InfoWindow, aby przeładować po zakończeniu imageLoader? Kiedy wkładam

marker.showInfoWindow()

Do onLoadingComplete tworzy nieskończoną pętlę, w której pojawi się znacznik, rozpocznie ładowanie obrazu, sam się pojawi itp.

Mój drugi problem polega na tym, że przy wolnym połączeniu sieciowym (symulowanym z opóźnieniem 5000ms w kodzie), ImageView w InfoWindow zawsze wyświetli ostatnio załadowany obraz, bez względu na to, czy należy do tego ImageWindow/ Marker.

Jakieś sugestie, jak to propperly wdrożyć?

Author: asco, 2013-03-19

4 answers

Powinieneś wykonywać Marker.showInfoWindow() na znaczniku, który aktualnie wyświetla okno informacji po otrzymaniu aktualizacji modelu.

Więc musisz zrobić 3 rzeczy:

  1. stwórz model i nie umieszczaj całego pobrania w InfoWindowAdapter
  2. save reference to Marker (call it markerShowingInfoWindow)
    od getInfoContents(Marker marker)
  3. gdy model powiadomi Cię o pobraniu pełnego połączenia
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
    markerShowingInfoWindow.showInfoWindow();
}
 31
Author: MaciejGórski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 01:01:52

Zrobiłem coś podobnego. To wciąż dawało mi błąd recesji

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
    markerShowingInfoWindow.showInfoWindow();
}
Więc po prostu zamknąłem okno i otworzyłem je ponownie.]}
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {

    markerShowingInfoWindow.hideInfoWindow();
    markerShowingInfoWindow.showInfoWindow();

}

Dla bardziej szczegółowej wersji tej samej odpowiedzi oto moja oryginalna soultion LINK

 3
Author: James Nicholson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:21
 0
Author: Risadinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 18:36:32

Byłem również w tej samej sytuacji i rozwiązany za pomocą poniższego kodu.

W moim adapterze dodałem zmienną publiczną

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {

    public String ShopName="";   

    -------
    -------

     @Override
    public View getInfoWindow(Marker arg0) {

         View v;
         v = mInflater.inflate(R.layout.info_window, null);

         TextView shop= (TextView) v.findViewById(R.id.tv_shop);

         shop.setText(ShopName);


    }
}

I dodał MarkerClickListener w mojej głównej działalności

----

MarkerInfoWindowAdapter mMarkerInfoWindowAdapter;

----
----

@Override
public void onMapReady(GoogleMap googleMap) {


    mMarkerInfoWindowAdapter = new MarkerInfoWindowAdapter(getApplicationContext());



    mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(final Marker arg0) {

            mMarkerInfoWindowAdapter.ShopName= "my dynamic text";

            arg0.showInfoWindow();

            return true;
        }
    }

    mMap.setInfoWindowAdapter(mMarkerInfoWindowAdapter);


}
 0
Author: Bikesh M Annur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 07:13:46