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

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

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

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

Ответ 1

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

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

  • создайте модель и не поместите всю загрузку в InfoWindowAdapter
  • сохранить ссылку на маркер (назовите его markerShowingInfoWindow)
    от getInfoContents(Marker marker)
  • когда модель уведомляет вас о завершении полной загрузки
if (markerShowingInfoWindow != null && markerShowingInfoWindow.isInfoWindowShown()) {
    markerShowingInfoWindow.showInfoWindow();
}

Ответ 2

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

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

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

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

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

}

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

Ответ 4

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

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

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


}