使用自定义INFOWINDOW与MySQL

问题描述:

我有一个地图,我显示存储在数据库(MySQL)中的标记,每个标记都有不同的字段(例如:名称,电子邮件,地址等),因为“MarkerOptions”只允许我使用“.tittle”,“。snippet”,我想要附加的一些字段被省略,现在我知道我必须使用自定义infowindow来显示我想要的所有字段。我怎样才能做到这一点? 我的代码:使用自定义INFOWINDOW与MySQL

主营:

ArrayList<HashMap<String, String>> location = null; 
    String url = "http://appserver.eco.mx/movil/getLanLong.php"; 
    try { 

     JSONArray data = new JSONArray(getHttpGet(url)); 
     location = new ArrayList<HashMap<String, String>>(); 
     HashMap<String, String> map; 

     for(int i = 0; i < data.length(); i++){ 
      JSONObject c = data.getJSONObject(i); 
      map = new HashMap<String, String>(); 
      map.put("id", c.getString("id")); 
      map.put("campo_latitud", c.getString("campo_latitud")); 
      map.put("campo_longitud", c.getString("campo_longitud")); 
      map.put("campo_categoria", c.getString("campo_categoria")); 
      map.put("campo_estado", c.getString("campo_estado")); 
      location.add(map); 
     } 
    } catch (JSONException e) { 
// TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    String campouno = ""; 
    if(!TextUtils.isEmpty(campouno)){ 
     double campo_latitud = Double.parseDouble(campouno); 
    } 
    //campo_latitud = Double.parseDouble(location.get(0).get("Latitude").toString()); 
    String campodos = ""; 
    if(!TextUtils.isEmpty(campodos)){ 
     double campo_longitud = Double.parseDouble(campodos); 
    } 

    for (int i = 0; i < location.size(); i++) { 
     if(!TextUtils.isEmpty(location.get(i).get("campo_latitud").toString())&&!TextUtils.isEmpty(location.get(i).get("campo_longitud").toString())) { 
      campo_latitud = Double.parseDouble(location.get(i).get("campo_latitud").toString()); 
      campo_longitud = Double.parseDouble(location.get(i).get("campo_longitud").toString()); 
     } 

String name = location.get(i).get("campo_categoria").toString(); 
     //String des = location.get(i).get("campo_descripcion").toString(); 

     if(location.get(i).get("campo_categoria").toString().equals("Obras publicas")){ 
      //System.out.println(location.get(i).get("campo_descripcion").toString()); 
      googleMap.addMarker(new MarkerOptions().position(new LatLng(campo_latitud, campo_longitud)).title(name).icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_op))); 
     } 
    }} 

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@android:color/white"> 

<TextView 
    android:id="@+id/info_window_nombre" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:paddingLeft="5dp" 
    android:text="Carlo Estrada Solano" /> 

<TextView 
    android:id="@+id/info_window_placas" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textStyle="bold" 
    android:textSize="20sp" 
    android:layout_below="@id/info_window_nombre" 
    android:paddingLeft="5dp" 
    android:text="Placas: SX5487" /> 

<TextView 
    android:id="@+id/info_window_estado" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/info_window_placas" 
    android:paddingLeft="5dp" 
    android:text="Estado: Activo" /> 

</LinearLayout> 

信息窗口类:

public class AdaptadorInforWindow implements GoogleMap.InfoWindowAdapter { 

private static final String TAG = "CustomInfoWindowAdapter"; 
private LayoutInflater inflater; 

public AdaptadorInforWindow(LayoutInflater inflater){ 
    this.inflater = inflater; 
} 

@Override 
public View getInfoWindow(Marker marker) { 
    //Carga layout personalizado. 
    View v = inflater.inflate(R.layout.infowindow_layout, null); 
    String[] info = marker.getTitle().split("&"); 
    String url = marker.getSnippet(); 
    ((TextView)v.findViewById(R.id.info_window_nombre)).setText("Lina Cortés"); 
    ((TextView)v.findViewById(R.id.info_window_placas)).setText("Placas: SRX32"); 
    ((TextView)v.findViewById(R.id.info_window_estado)).setText("Estado: Activo"); 

    return v; 
} 

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

集的GoogleMap:

myGoogleMap.setInfoWindowAdapter(new CustomInfoWindowAdapter(LayoutInflater.from(getActivity()))); 
+0

该代码似乎很好。任何问题? –

+0

我的意思是它工作的很好,但我没有做我所需要的,我想使用costum infowindow,但在xml中我写了名称,地址等,我想使用来自数据库的名称,地址和将其设置到服装infowindow @LalitSinghFauzdar – Armando

所以我刚刚为我的应用做了一个CustomInfoWindow。以下是您可以实现的方法。

首先在你的数据库文件中创建一个方法只是访问所有相关的标记数据和代码如下:

Cursor getDetails(Marker marker){    
      db = getReadableDatabase();   
      String query = "select Name, Email, Address from YourTableName where Name = '"+marker.getTitle()+"';"; 
      return db.rawQuery(query,null); 
    } 

然后调整您的AdaptadorInforWindow的代码如下:

YourDatabaseClass db = new YourDatabaseClass(context); 
    Cursor c = db.getDetails(); //Method you'll create in database class 
    ((TextView)v.findViewById(R.id.info_window_name)).setText(c.getString(0)); 
    ((TextView)v.findViewById(R.id.info_window_email)).setText(c.getString(1)); 
    ((TextView)v.findViewById(R.id.info_window_address)).setText(c.getString(2)); 
    c.close(); 

请参阅getString,因为我猜你已经使用Text/String数据类型来存储您的姓名,电子邮件和地址值。请记住,如果数据类型发生变化,那么对于int等,您必须使用适当的方法,如c.getInt(index)

此外,索引0,1,2与查询中的名称相同:名称电子邮件地址。

这样你就可以将你的数据显示在你的CustomInfoWindow中。

同样在我的工作很好,我敢肯定,这将工作。

+0

@Armando这是需要的答案。 –

+0

您的意思是添加此“光标getDetails(标记标记){ db = getReadableDatabase(); String query =”select Name,Email,Address from YourTableName where Name ='“+ marker.getTitle()+”';“; return php.rawQuery(query,null); }“在PHP文件bro? – Armando

+0

啊!我不知道你正在使用PHP ... @Armando,但你可以自定义它来获取当前标记的细节,不是吗? –

使用标记键在Hashmap中存储标记。然后使用自定义infowindow使用hashmap对象来检索其他信息。 当您点击标记时,它会显示相关信息。

或者您可以从8:00开始在病房观看此视频。 Click Here

+0

如何使用标记键?我看到了视频,但我没有看到从数据库中获取值的位置 – Armando

+1

https://*.com/questions/16496715/how-to-know-which-marker-was-clicked-on-google- maps-v2-for-android –

+0

我能够做到我所提到的,但是yur信息帮了我很多,谢谢! – Armando