Динамическое содержимое в Maps V2 InfoWindow

Я хочу показать InfoWindow на маркерах во фрагменте Maps V2. Дело в том, что я хочу показать растровые изображения, которые динамически загружаются из Интернета с помощью Универсального загрузчика изображений.

Это мой 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;
    }

}

У меня есть 2 проблемы с этим:

Как мы знаем, InfoWindow рисуется, а затем меняется на него (в моем случае новый BitMap на ImageView) не отображаются/ InfoWindow не обновляются. Как я могу «уведомить» InfoWindow о перезагрузке после завершения imageLoader? когда я положил

marker.showInfoWindow()

в onLoadingComplete он создал бесконечный цикл, в котором маркер будет всплывать, начинать загрузку изображения, всплывать и т. д.

Моя вторая проблема заключается в том, что при медленном сетевом соединении (имитируемом с задержкой 5000 мс в коде) ImageView в InfoWindow всегда будет отображать последнее загруженное изображение, независимо от того, принадлежит ли это изображение этому ImageWindow/Marker.

Любые предложения о том, как правильно реализовать это?


person fweigl    schedule 19.03.2013    source источник


Ответы (4)


Вы должны делать Marker.showInfoWindow() на маркере, который в настоящее время показывает информационное окно, когда вы получаете обновление модели.

Итак, вам нужно сделать 3 вещи:

  1. создать модель и не помещать все загрузки в InfoWindowAdapter
  2. сохранить ссылку на маркер (назовите его markerShowingInfoWindow)
    из getInfoContents(Marker marker)
  3. когда модель уведомляет вас о завершении загрузки вызова
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
    markerShowingInfoWindow.showInfoWindow();
}
person MaciejGórski    schedule 20.03.2013
comment
Может ли кто-нибудь выложить код, если кто-то решил проблему? - person Nishant Shah; 22.04.2013
comment
Программирование не сводится к выполнению операции копирования-вставки. Мой ответ должен быть простым для понимания, а если это не так, вы можете задать вопрос, чтобы прояснить ситуацию. - person MaciejGórski; 30.04.2013
comment
Если пользователь щелкнет другой маркер до onLoadingComplete, не получит ли неправильный infoWindow эту загрузку? - person Ejmedina; 20.05.2013
comment
Информационное окно @Ejmedina не загружается. В моей архитектуре модель предложения хранит изображение, уведомляет контроллер представления (активность/фрагмент), который проверяет, следует ли обновлять текущее отображаемое информационное окно: когда загруженное изображение связано с объектом модели, для которого отображается информационное окно. - person MaciejGórski; 20.05.2013
comment
Спасибо @MaciejGórski за разъяснение. Я постараюсь следовать вашему предложению. Как модель должна уведомлять представление? Вы реализовали это? - person Ejmedina; 21.05.2013
comment
В простейшей форме вы можете использовать шаблон Observer. Вы также можете использовать широковещательные рассылки (см. LocalBroadcastManager) или шина событий (например, Отто из Square). Да, я сделал. - person MaciejGórski; 21.05.2013
comment
@MaciejGórski спасибо, это работает! Я использовал EventBus (от greenrobot). - person pawegio; 23.01.2014
comment
@ MaciejGórski эй, спасибо .. я думаю, что метод изменился .. markerShowingInfoWindow.isInfoWindowShown () .. у меня работает .. - person sham.y; 18.01.2015
comment
@sham.y Хороший улов спустя почти 2 года. Вероятно, я набирал это в уме и не заглядывал в документацию. Имя метода не может быть изменено. Я исправил это, спасибо. - person MaciejGórski; 20.01.2015
comment
Если я сделаю только ответ, проблема с бесконечным циклом все еще существует! Мне нужно добавить кеш типа HashMap‹Marker,Bitmap›, поэтому каждый раз, когда мне нужно загрузить изображение, я буду проверять, загружено ли изображение уже, таким образом я решаю проблему с бесконечным вызовом getInfoContents(). Или я что-то неправильно понял? - person hungson175; 12.07.2016

Я сделал что-то подобное. Это все еще давало мне ошибку рецессии

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {
    markerShowingInfoWindow.showInfoWindow();
}

Итак, что я сделал, это просто закрыл окно и снова открыл его.

if (markerShowingInfoWindow != null && markerShowingInfoWindow.isShowingInfoWindow()) {

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

}

для более подробной версии того же ответа здесь находится моя оригинальная душа ССЫЛКА

person James Nicholson    schedule 27.03.2014
comment
Это больше похоже на комментарий к принятому ответу. Если вам действительно нужно это сделать, то, похоже, это ошибка в Google Maps Android API v2. Я никогда не сталкивался с этой ошибкой, и у меня не было проблем без использования скрытия... - person MaciejGórski; 20.01.2015
comment
У меня снова сработал простой вызов .showInfoWindow! Спасибо за идею - person Denny; 26.11.2016

Я также столкнулся с такой же ситуацией и решил, используя следующий код.

В моем адаптере я добавил общедоступную переменную

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);


    }
}

и добавил MarkerClickListener в мою основную деятельность

----

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);


}
person Bikesh M    schedule 25.11.2015

Я использовал код из этой статьи, и он работал хорошо.

http://androidfreakers.blogspot.de/2013/08/display-custom-info-window-with.html

person Risadinha    schedule 20.01.2014
comment
Ответы только по ссылкам не приветствуются. - person MaciejGórski; 20.01.2015