【问题标题】:Customizing InfowindowAdapter to add images from Content provider自定义 InfowindowAdapter 以添加来自 Content Provider 的图像
【发布时间】:2014-03-15 08:30:23
【问题描述】:

我有一个使用标记在地图上显示地点的应用程序,我自定义了信息窗口来显示创建的地点的内容、标题、描述和图片,这些数据是通过内容提供者访问的,我的问题一切都很好直到我从数据库中删除一条记录,应用程序变得疯狂,或损坏或只是奇怪地识别记录 ID 等 问题显然出在信息窗口代码自定义中,因为要删除它一切正常,创建,删除,创建标记等..但即使我尝试过也没有给出错误。

地狱密码:

class MyInfoWindowAdapter implements InfoWindowAdapter {

    View v;

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

    }

    @SuppressWarnings("deprecation")
    @Override
    public View getInfoWindow(final Marker marker) {

        MapaLugaresActivity.this.marker = marker;

        c.requery();

        TextView tvTitulo = (TextView) v.findViewById(R.id.tituloi);
        tvTitulo.setText(marker.getTitle());
        // TextView tvDescr = (TextView) v.findViewById(R.id.descripcioni);
        // tvDescr.setText(marker.getSnippet());
        ImageView imgi = (ImageView) v.findViewById(R.id.imgi);

        if (marker.getSnippet() != null && marker != null
                && c.getCount() > 0) {

            try {

                if (c.moveToFirst()) {

                    c.moveToPosition(Integer.valueOf(marker.getSnippet()) - 1);

                    String img = c.getString(c.getColumnIndex("foto"));

                    if (img != null) {

                        resizedBitmap = DecodeImagen
                                .decodeSampledBitmapFromFile(img, 100, 100);
                        imgi.setAdjustViewBounds(true);
                        imgi.setImageBitmap(resizedBitmap);

                    } else {

                        imgi.setAdjustViewBounds(true);
                        imgi.setImageResource(R.drawable.paisaje);

                    }

                }
            } catch (NumberFormatException e) {

                e.printStackTrace();
            }

        }
        // imgi.setImageResource(R.drawable.rdlv);

        Typeface fuente = Typeface.createFromAsset(getAssets(),
                "TravelingTypewriter.ttf");

        tvTitulo.setTypeface(fuente);
        // tvDescr.setTypeface(fuente);

        return v;

    }

    @Override
    public View getInfoContents(Marker marker) {
        if (MapaLugaresActivity.this.marker != null
                && MapaLugaresActivity.this.marker.isInfoWindowShown()) {
            MapaLugaresActivity.this.marker.hideInfoWindow();
            MapaLugaresActivity.this.marker.showInfoWindow();
        }

        return null;
    }

}

添加标记:

                 @SuppressWarnings("deprecation")
public void addMarker() {

    map.clear();
    c.requery();

    if (c.getCount() > 0) {

        c.moveToFirst();

        do {

            latlong = new LatLng(c.getFloat(c.getColumnIndex("latitud")),
                    c.getFloat(c.getColumnIndex("longitud")));
            final MarkerOptions marker = new MarkerOptions().title(c
                    .getString(c.getColumnIndex("titulo")));
            marker.snippet(c.getString(c.getColumnIndex("_id")));

            marker.position(latlong);

            map.addMarker(marker).showInfoWindow();

        } while (c.moveToNext());

    } else {
        Toast.makeText(MapaLugaresActivity.this, "Añada un nuevo lugar",
                Toast.LENGTH_SHORT).show();
    }

}

我提前感谢您的帮助,花了几天时间试图找到解决方案,我认为是时候寻求帮助了,谢谢。我的编程经验有限,希望您的理解

PS:我已经在 GitHub 上上传了项目,以防有人想分析它:D

活动 MapaLugaresActivity 中的代码

https://github.com/Shochlves/rdlv

图像信息窗口:

https://lh5.ggpht.com/eBgrw0riQxfGph4FhxXvMRDxzYjlvdWw6L6qRqg_L1oV9yPGHPW9wV2Cal7zVGj1-HY=h900-rw

【问题讨论】:

  • 删除数据库中的行后是否重新加载Cursor
  • 我没有,应该这样做?通知更改()?请原谅我对这一点的无知,感谢您的及时回复
  • 我不能告诉你在这种情况下你应该应该做什么,因为我对你的应用了解不够。但是,如果您确实更新您的Cursor,您将需要重建所有标记,因为您将Cursor-特定位置存储在sn- p.
  • 感谢您的回复,我正在尝试重新查询()(已弃用)和map.clear(),似乎取得了一些进展但无法正常工作,感谢任何帮助,我我被困在这个问题上,直到找到解决方案我才会停止如果你想要更好的外观,他们有一个 Github 链接......谢谢
  • 我更新了当前有问题的代码并添加了添加标记的方法

标签: android database sqlite google-maps google-maps-markers


【解决方案1】:

解决了!该解决方案已实现 Hastable (http://developer.android.com/reference/java/util/Hashtable.html),我点击了代码,因为它很有帮助。 带有来自 SQLite(内容提供者)的图像和标题的 InfoWindowAdapter

InfoWindowAdapter:

public class MyInfoWindowAdapter implements InfoWindowAdapter {



    private View v;

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

    }
    @Override
    public View getInfoContents(Marker marker) {
        if (MapaLugaresActivity.this.marker != null
                && MapaLugaresActivity.this.marker.isInfoWindowShown()) {
            MapaLugaresActivity.this.marker.hideInfoWindow();
            MapaLugaresActivity.this.marker.showInfoWindow();
        }

        return null;
    }

    @Override
    public View getInfoWindow(Marker marker) {

        MapaLugaresActivity.this.marker = marker;
        String img = null;

         if (marker.getId() != null && markers != null && markers.size() > 0) {
                if ( markers.get(marker.getId()) != null &&
                        markers.get(marker.getId()) != null) {
                    img = markers.get(marker.getId());
                }
            }
        final ImageView imgi = (ImageView) v.findViewById(R.id.imgi);

        if (img != null && !img.equalsIgnoreCase("null")
                && !img.equalsIgnoreCase("")) {

            Bitmap resizedBitmap = DecodeImagen
                    .decodeSampledBitmapFromFile(img, 100, 100);

            imgi.setImageBitmap(resizedBitmap);

        } else {
            imgi.setAdjustViewBounds(true);
            imgi.setImageResource(R.drawable.paisaje);
        }


        TextView tvTitulo = (TextView) v.findViewById(R.id.tituloi);
        tvTitulo.setText(marker.getTitle());
        //TextView tvDescr = (TextView) v.findViewById(R.id.descripcioni);
        //tvDescr.setText(marker.getSnippet());



        Typeface fuente = Typeface.createFromAsset(getAssets(),
                "TravelingTypewriter.ttf");

        tvTitulo.setTypeface(fuente);
        // tvDescr.setTypeface(fuente);


        return v;

    }



}

添加标记:

public void addMarker() {

    markers = new Hashtable<String, String>();
    c.requery();

    if (c.getCount() > 0) {

        c.moveToFirst();

        do {


            latlong = new LatLng(c.getFloat(c.getColumnIndex("latitud")),
                    c.getFloat(c.getColumnIndex("longitud")));
            final Marker marker = map.addMarker(new MarkerOptions().title(c
                    .getString(c.getColumnIndex("titulo"))).snippet(c.getString(c.getColumnIndex("_id"))).position(latlong)); 

            markers.put(marker.getId(), c.getString(c.getColumnIndex("foto")));



        } while (c.moveToNext());

    } else {
        Toast.makeText(MapaLugaresActivity.this, "Añada un nuevo lugar",
                Toast.LENGTH_SHORT).show();
    }

}

创建:

if (map != null) {
        map.setInfoWindowAdapter(new MyInfoWindowAdapter());

        addMarker();
    }

问候

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 2013-09-27
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多