2017-04-12 21 views
0

我嘗試爲我的地圖活動添加一種「預覽」。在這個活動中應該顯示名稱和後面的標記地址(在json中設置)。不幸的是,我沒有得到所選標記的正確內容。我只是得到其中一個項目的內容。這裏是我的代碼:嘗試從JSON獲取Linearlayout的正確內容,但每次都獲取相同的內容

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback 



@Override 
protected void onCreate(Bundle savedInstanceState) { 

    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 
    contactList = new ArrayList<>(); 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map3); 
    mapFragment.getMapAsync(this); 
    ImageButton locations = (ImageButton) findViewById(R.id.btnloc); 
    locations.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(MapsActivity.this, Locations.class); 
      startActivity(i); 
     } 
    }); 

} 



private class GetContacts extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 


    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     HttpHandler sh = new HttpHandler(); 


     String jsonStr = sh.makeServiceCall(url); 

     Log.e(TAG, "Response from url: " + jsonStr); 

     if (jsonStr != null) { 
      try { 
       JSONObject jsonObj = new JSONObject(jsonStr); 


       JSONArray contacts = jsonObj.getJSONArray("contacts"); 


       for (int i = 0; i < contacts.length(); i++) { 
        JSONObject c = contacts.getJSONObject(i); 

        String id = c.getString("id"); 
        String name = c.getString("name"); 
        String street = c.getString("street"); 
        String postalcode = c.getString("postalcode"); 
        String musicstyle = c.getString("musicstyle"); 
        String musicsecond = c.getString("musicsecond"); 
        String entry = c.getString("entry"); 
        String opening = c.getString("opening"); 
        String agegroup = c.getString("agegroup"); 
        String imageurl = c.getString("imageurl"); 
        String urlbtn = c.getString("urlbtn"); 
        String Fsk = c.getString("Fsk"); 
        String city = c.getString("city"); 
        String lat = c.getString("lat"); 
        String lng = c.getString("lng"); 




        // tmp hash map for single contact 
        HashMap<String, String> contact = new HashMap<>(); 

        // adding each child node to HashMap key => value 
        contact.put("id", id); 
        contact.put("name", name); 
        contact.put("street",street); 
        contact.put("postalcode",postalcode); 
        contact.put("musicstyle",musicstyle); 
        contact.put("musicsecond",musicsecond); 
        contact.put("entry",entry); 
        contact.put("opening",opening); 
        contact.put("agegroup",agegroup); 
        contact.put("imageurl",imageurl); 
        contact.put("urlbtn",urlbtn); 
        contact.put("Fsk",Fsk); 
        contact.put("city",city); 
        contact.put("lat", lat); 
        contact.put("lng", lng); 

        latitude = Double.parseDouble(lat); longitude = Double.parseDouble(lng); 
        contactList.add(contact); 
        namec = lat; 
        Imageurl = imageurl; 


       } 
      } catch (final JSONException e) { 
       Log.e(TAG, "Json parsing error: " + e.getMessage()); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Json parsing error: " + e.getMessage(), 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 

      } 
     } else { 
      Log.e(TAG, "Couldn't get json from server."); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(), 
          "Couldn't get json from server. Check LogCat for possible errors!", 
          Toast.LENGTH_LONG) 
          .show(); 
       } 
      }); 

     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     for (final HashMap<String, String> contact: contactList) { 

      LatLng P1 = new LatLng(
         Double.parseDouble(contact.get("lat")), 
        Double.parseDouble(contact.get("lng"))); 

      mMap.addMarker(new MarkerOptions().position(P1).title(contact.get("name"))); 
      mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
       @Override 
       public boolean onMarkerClick(Marker marker) { 

        LinearLayout prev = (LinearLayout) findViewById(R.id.preview); 
        prev.setVisibility(View.VISIBLE); 
        TextView nameprev = (TextView) findViewById(R.id.namepre); 

        nameprev.setText(contact.get("name")); 
        Toast.makeText(getApplicationContext(),contact.get("name"),Toast.LENGTH_LONG).show(); 
        return false; 


       } 
      }); 

      mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
       @Override 
       public void onMapClick(LatLng latLng) { 
        LinearLayout prev = (LinearLayout) findViewById(R.id.preview); 
        prev.setVisibility(View.INVISIBLE); 
        TextView nameprev = (TextView) findViewById(R.id.namepre); 
        nameprev.setText("Clubname"); 
       } 
      }); 

     } 
    } 


} 

@Override 
public void onMapReady(GoogleMap googleMap) { 

    mMap = googleMap; 
    new GetContacts().execute(); 
    mMap.setMyLocationEnabled(true); 




} 

}

回答

0

你叫setOnMarkerClickListener你的循環內。因爲這是整個地圖的設置器,所以每次都會覆蓋偵聽器。所以,我希望你總是看到最後聯繫人的信息。相反,您應該只調用此方法一次。所以不是在你的循環。

現在,您會注意到您無權訪問您的聯繫人對象。您必須使用傳遞給click事件的標記來選擇正確的聯繫人。您已將標記的標題設置爲聯繫人的姓名,因此您應該能夠將標記拉出標記並使用它找到正確的聯繫人。

喜歡的東西:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
      @Override 
      public boolean onMarkerClick(Marker marker) { 
       String name = marker.getTitle(); 
       HashMap<String, String> currContact = contactList.stream().filter(c -> c.get("name").equals(name)).findFirst().get(); 
       LinearLayout prev = (LinearLayout) findViewById(R.id.preview); 
       prev.setVisibility(View.VISIBLE); 
       TextView nameprev = (TextView) findViewById(R.id.namepre); 

       nameprev.setText(currContact.get("name")); 
       Toast.makeText(getApplicationContext(),currContact.get("name"),Toast.LENGTH_LONG).show(); 
       return false; 


      } 
     }); 

如果保存在標記的標籤在整個接觸的參考,很可能會更簡單。

Marker marker = mMap.addMarker(new MarkerOptions().position(P1).title(contact.get("name"))); 
marker.setTag(contact); 

然後在事件中,你應該能夠拉動整個對象了,而不是僅僅名稱:

HashMap<String, String> currContact = (HashMap<>) marker.getTag(); 
+0

不工作,因爲在標記後面不僅僅是我需要解析到我的Linearlayout的名稱,所以這只是一個例子。我不得不解析這些東西。 –

+0

如果我嘗試設置標籤,我怎樣才能從標籤中提取內容? –

+0

我解決了它使用以下鏈接:http://stackoverflow.com/questions/15333971/get-other-values-from-marker –

0

添加mMap.setOnMarkerClickListener()mMap.setOnMapClickListener()onCreate()方法:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ................ 
     ......................... 

     mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
      @Override 
      public boolean onMarkerClick(Marker marker) { 

       LinearLayout prev = (LinearLayout) findViewById(R.id.preview); 
       prev.setVisibility(View.VISIBLE); 
       TextView nameprev = (TextView) findViewById(R.id.namepre); 

       nameprev.setText(contact.get("name")); 
       Toast.makeText(getApplicationContext(),contact.get("name"),Toast.LENGTH_LONG).show(); 
       return false; 


      } 
     }); 

     mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
      @Override 
      public void onMapClick(LatLng latLng) { 
       LinearLayout prev = (LinearLayout) findViewById(R.id.preview); 
       prev.setVisibility(View.INVISIBLE); 
       TextView nameprev = (TextView) findViewById(R.id.namepre); 
       nameprev.setText("Clubname"); 
      } 
     }); 
    } 

更新onPostExecute()如下:

@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 

    for (final HashMap<String, String> contact: contactList) { 

     LatLng P1 = new LatLng(Double.parseDouble(contact.get("lat")), 
           Double.parseDouble(contact.get("lng"))); 

     mMap.addMarker(new MarkerOptions().position(P1).title(contact.get("name"))); 

    } 
} 
+0

不工作,因爲我得到的JSON數據晚於onCreate它想:( –