Android GoogleMap 2 динамически обновляет информацию в InfoWindow с помощью ImageView через универсальный загрузчик изображений

Я работаю над новым API Google Map v2.

Я использовал ImageLoader для динамического отображения изображений на маркере.

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

В следующий раз, если я нажму на тот же маркер, изображение будет отображаться из кэша универсального загрузчика изображений.

Ниже приведен мой код CustomInfoWindowAdapter:

private class CustomInfoWindowAdapter implements InfoWindowAdapter {

    @Override
    public View getInfoContents(Marker marker) {
        return null;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        final View mWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);

        render(marker, mWindow);
        return mWindow;
    }

    private void render(final Marker marker, View view) {

        final String url = markers.get(marker.getId()).getStrProfilePic();
        final ImageView image = ((ImageView) view.findViewById(R.id.badge));
        Log.e(TAG, "URL : " + url);

        if ( url != null && !url.equalsIgnoreCase("null")
                && !url.equalsIgnoreCase("")) {
            imageLoader.displayImage(url, image, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage) {
                    super.onLoadingComplete(imageUri, view, loadedImage);
                    ((ImageView) view).invalidate();
                }
            });
        } else {
            image.setImageResource(R.drawable.noimage);
        }

        final String title = marker.getTitle();
        final TextView titleUi = ((TextView) view.findViewById(R.id.title));
        if (title != null) {
            titleUi.setText(title);
        } else {
            titleUi.setText("");
        }

        final String snippet = marker.getSnippet();
        final TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
        if (snippet != null) {
            snippetUi.setText(snippet);
        } else {
            snippetUi.setText("");
        }
    }
}

Я сохраняю идентификаторы маркеров в HashTable, когда добавляю маркер. И от них я получу URL фотографии.


person Nishant Shah    schedule 22.04.2013    source источник
comment
Показать варианты? Конфигурация? Вы вызываете displayImage(...) в потоке пользовательского интерфейса?   -  person nostra13    schedule 22.04.2013
comment
В рендере (конечный маркер маркера, вид просмотра) я вызвал метод imageLoader.displayImage(....).   -  person Nishant Shah    schedule 22.04.2013


Ответы (2)


Я взял один объект Marker на уровне класса и использовал этот объект для обновления информации о маркере.

Я настроил свой класс, как показано ниже, для обновления ImageView:

private class CustomInfoWindowAdapter implements InfoWindowAdapter {

    private View view;

    public CustomInfoWindowAdapter() {
        view = getLayoutInflater().inflate(R.layout.custom_info_window, null);          
    }

    @Override
    public View getInfoContents(Marker marker) {

        if ( YourClassName.this.marker != null &&
                ClassName.this.marker.isInfoWindowShown() ) {
            YourClassName.this.marker.hideInfoWindow();
            YourClassName.this.marker.showInfoWindow();
        }
        return null;
    }

    @Override
    public View getInfoWindow(final Marker marker) {
        YourClassName.this.marker = marker;

        final String url = markers.get(marker.getId()).getStrProfilePic();
        final ImageView image = ((ImageView) view.findViewById(R.id.badge));

        if ( url != null && !url.equalsIgnoreCase("null")
                && !url.equalsIgnoreCase("")) {
            imageLoader.displayImage(url, image, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view,
                        Bitmap loadedImage) {
                    super.onLoadingComplete(imageUri, view, loadedImage);
                    getInfoContents(marker);
                }
            });
        } else {
            image.setImageResource(R.drawable.noimage);
        }

        final String title = marker.getTitle();
        final TextView titleUi = ((TextView) view.findViewById(R.id.title));
        if (title != null) {
            titleUi.setText(title);
        } else {
            titleUi.setText("");
        }

        final String snippet = marker.getSnippet();
        final TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
        if (snippet != null) {
            snippetUi.setText(snippet);
        } else {
            snippetUi.setText("");
        }

        return view;
    }
}

Проверьте пример

person Nishant Shah    schedule 23.04.2013
comment
В моем приложении я не могу показывать несколько карт. Но в Map2 можно отображать несколько карт. Демо доступно в Android SDK с сервисом Google Play. - person Nishant Shah; 24.04.2013
comment
@NishantShah +1 за ваш ответ, но. если вы опубликуете URL своего блога в комментарии, это будет проще для всего примера :) androidfreakers.blogspot.in спасибо :) - person Bhavin Chauhan; 12.08.2013
comment
@BhavinChauhan Добавил ссылку. Спасибо. - person Nishant Shah; 13.08.2013
comment
Гений! единственный метод обновления информационного окна, который действительно работал для меня: D - person Matan Dahan; 22.11.2015

Представление, возвращенное из обратных вызовов информационного окна, не может быть впоследствии обновлено.

Попробуйте выполнить это предложение: Динамическое содержимое в Maps V2 InfoWindow

person MaciejGórski    schedule 22.04.2013