我遇到了这个问题,我希望有人能引导我找到解决方案,我已经花了3天才到现在为止..
问题
我有2个活动,活动A是从JSON列表填充的列表视图.活动B是基于相同json列表的Google maps v2,但是它不在列表上.
on activity 一个列表onItemclicklistener
,当我点击它时显示另一个活动,它的工作正常.这里没问题.一切都像是假设的那样.
在Activity B上有map片段,它也填充了JSON列表中的lat-lng值.所以地图上有10个+标记.因此,当我点击标记时,我得到的名称和地址以及它的工作正常.
这就是我想要的
当我点击列表中的项目就带我到活动Ç.并且有一些文本视图显示公司哪些日子是公开的.这一步已经完成,它的工作正常,所有的东西都是这样的.
当我点击地图时,有标记,所以我有onInfoWindowClick()
.它也没关系,但我如何从中获得更多价值onInfoWindowClick()
?
我的意思是,我可以得到(来自标记的getSnippet和getTitle)但我在列表中有其他值,如name,days,id's.我得到的只是.getsnippet和getTitle通过标记.
我非常坚持这个问题.我真的想在列表上做同样的事情.当我按下列表时它获取所有值但是当我在地图上时我只能获得带有标题和片段的标记窗口.我很抱歉,如果我无法解释好,请随时问我是否有更多你想看的代码.
for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME)) );
Run Code Online (Sandbox Code Playgroud)
@Override
public void onInfoWindowClick(Marker marker) {
marker.getTitle();
marker.getSnippet();
}
Run Code Online (Sandbox Code Playgroud)
更新的代码
public class MapBased extends AbstractMapActivity implements OnNavigationListener,OnInfoWindowClickListener
{
private static final String TAG_Location = "location_id";
private static final String TAG_Company = "company_id";
private static final String TAG_PLACE = "place";
private static final String TAG_POSTAL = "postal";
private static final String TAG_CITY = "city";
private static final String TAG_MONDAY = "monday";
private static final String TAG_TUESDAY = "tuesday";
private static final String TAG_WEDNESDAY = "wednesday";
private static final String TAG_THURSDAY = "thursday";
private static final String TAG_FRIDAY = "friday";
private static final String TAG_SATURDAY = "saturday";
private static final String TAG_SUNDAY = "sunday";
private static final String TAG_TYPE = "type";
private static final String TAG_NOCAR = "nocar";
private static final String TAG_NAME = "name";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_ADDRESS = "address";
private static final String TAG = "Debug of Project"; //
private String a;
private String b;
private double my_lat;
private double my_lng;
private static final String STATE_NAV="nav";
private static final int[] MAP_TYPE_NAMES= { R.string.normal, R.string.hybrid, R.string.satellite, R.string.terrain };
private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE,
GoogleMap.MAP_TYPE_TERRAIN };
private GoogleMap map=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase db = openOrCreateDatabase("mydb.db", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS gps_kordinater (ID INTEGER PRIMARY KEY AUTOINCREMENT, Latitude REAL, Longitude REAL);");
String query = "SELECT Latitude,Longitude FROM gps_kordinater WHERE Id = (SELECT MAX(Id) FROM gps_kordinater)";
Cursor cursor = db.rawQuery(query, null);
if(cursor != null)
{
cursor.moveToFirst();
a = cursor.getString(0);
b = cursor.getString(1);
}
String url = "http://example.com";
my_lat = Double.valueOf(a);
my_lng = Double.valueOf(b);
db.close();
// now enabled if disabled = ingen support for jb aka 4.0
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
JSONParser jParser = new JSONParser();
JSONArray json = jParser.getJSONFromUrl(url);
try {
for(int i = 0; i < json.length(); i++){
JSONObject c = json.getJSONObject(i);
String lat = c.getString(TAG_LAT);
String lng = c.getString(TAG_LNG);
String name = c.getString(TAG_NAME);
String adresse = c.getString(TAG_ADDRESS);
String location_id = c.getString(TAG_Location);
String company_id = c.getString(TAG_Company);
String place = c.getString(TAG_PLACE) ;
String postal = c.getString(TAG_POSTAL);
String city = c.getString(TAG_CITY);
String monday = c.getString(TAG_MONDAY);
if(c.getString(TAG_MONDAY).isEmpty())
{
monday="Lukket";
}
else
{
monday=c.getString(TAG_MONDAY);
}
String tuesday = c.getString(TAG_TUESDAY);
if(c.getString(TAG_TUESDAY).isEmpty())
{
tuesday="Lukket";
}
else
{
tuesday=c.getString(TAG_TUESDAY);
}
String wednesday = c.getString(TAG_WEDNESDAY);
if(c.getString(TAG_WEDNESDAY).isEmpty())
{
wednesday="Lukket";
}
else
{
wednesday=c.getString(TAG_WEDNESDAY);
}
String thursday = c.getString(TAG_THURSDAY);
if(c.getString(TAG_THURSDAY).isEmpty())
{
thursday="Lukket";
}
else
{
thursday=c.getString(TAG_THURSDAY);
}
String friday = c.getString(TAG_FRIDAY);
if(c.getString(TAG_FRIDAY).isEmpty())
{
friday="Lukket";
}
else
{
friday=c.getString(TAG_FRIDAY);
}
String saturday = c.getString(TAG_SATURDAY);
if(c.getString(TAG_SATURDAY).isEmpty())
{
saturday="Lukket";
}
else
{
saturday=c.getString(TAG_SATURDAY);
}
String sunday=c.getString(TAG_SUNDAY);
if(c.getString(TAG_SUNDAY).isEmpty())
{
sunday="Lukket";
}
else
{
sunday=c.getString(TAG_SUNDAY);
}
String nocar = c.getString(TAG_NOCAR);
String type = c.getString(TAG_TYPE);
// creating new HashMap
HashMap<String, String> map2 = new HashMap<String, String>();
// adding each child node to HashMap key => value
map2.put(TAG_LAT, lat);
map2.put(TAG_LNG, lng);
map2.put(TAG_NAME, name);
map2.put(TAG_ADDRESS, adresse);
map2.put(TAG_Location, location_id);
map2.put(TAG_Company, company_id);
map2.put(TAG_PLACE, place);
map2.put(TAG_POSTAL, postal);
map2.put(TAG_CITY, city);
map2.put(TAG_MONDAY, monday);
map2.put(TAG_TUESDAY, tuesday);
map2.put(TAG_WEDNESDAY, wednesday);
map2.put(TAG_THURSDAY, thursday);
map2.put(TAG_FRIDAY, friday);
map2.put(TAG_SATURDAY, saturday);
map2.put(TAG_SUNDAY, sunday);
map2.put(TAG_TYPE, type);
map2.put(TAG_NOCAR, nocar);
// adding HashList to ArrayList
contactList.add(map2);
Log.d(TAG, "Hashmap 1: " + map2);
Log.d(TAG, "Hashmap 2: " + map2.values());
Log.d(TAG, "array 4: " + contactList);
}
Log.d(TAG, "array 5: " + contactList);
} catch (JSONException e) {
e.printStackTrace();
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
if (readyToGo()) {
setContentView(R.layout.map_based);
SupportMapFragment mapFrag=
(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map2);
initListNav();
map=mapFrag.getMap();
CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(my_lat , my_lng));
CameraUpdate zoom=CameraUpdateFactory.zoomTo(10);
map.moveCamera(center);
map.animateCamera(zoom);
for (HashMap<String, String> hashMap : contactList) {
map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME))
);
}
map.setInfoWindowAdapter(new PopupMapBasedAdapter(getLayoutInflater()));
map.setOnInfoWindowClickListener(this);
}
Button btn_web = (Button) findViewById(R.id.footer_list_btn);
btn_web.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//myVib.vibrate(50);
finish();
}
});
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
map.setMapType(MAP_TYPES[itemPosition]);
return(true);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(STATE_NAV,getSupportActionBar().getSelectedNavigationIndex());
}
@Override
public void onInfoWindowClick(Marker marker) {
marker.getTitle();
marker.getSnippet();
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV));
}
private void initListNav() {
ArrayList<String> items=new ArrayList<String>();
ArrayAdapter<String> nav=null;
ActionBar bar=getSupportActionBar();
for (int type : MAP_TYPE_NAMES) {
items.add(getString(type));
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
nav=
new ArrayAdapter<String>(
bar.getThemedContext(),
android.R.layout.simple_spinner_item,
items);
}
else {
nav=
new ArrayAdapter<String>(
this,
android.R.layout.simple_spinner_item,
items);
}
nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(nav, this);
}
}
Run Code Online (Sandbox Code Playgroud)
Tim*_*tje 20
您不能再向标记添加数据,除非您将所有数据都添加到代码段中.
因此,如果要向标记添加更多数据,则必须将其存储在与标记链接的外部变量中.
您可以使用此信息将映射到此ID的任何其他数据保存在单独的变量中.
例:
创建一个可以访问的变量:
/**
* Create your variable where you store all your data mapped to the marker ID,
* make it accessible where you want.
* The key of this hashmap is your marker ID, the value is another Map with extra data
*/
HashMap<String, HashMap> extraMarkerInfo = new HashMap<String, HashMap>();
Run Code Online (Sandbox Code Playgroud)
选项1更改标记代码,以便向此变量添加额外数据
for (HashMap<String, String> hashMap : contactList) {
// Create your marker like normal, nothing changes
Marker marker = map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME)));
// When you created the marker you store the extra data from your JSON in another variable (HashMap for example)
HashMap<String, String> data = new HashMap<String, String>();
data.put(TAG_Location,hashMap.get(TAG_Location));
data.put(TAG_Company,hashMap.get(TAG_Company));
data.put(TAG_PLACE,hashMap.get(TAG_PLACE));
data.put(TAG_POSTAL,hashMap.get(TAG_POSTAL));
data.put(TAG_CITY,hashMap.get(TAG_CITY));
data.put(TAG_MONDAY,hashMap.get(TAG_MONDAY));
data.put(TAG_TUESDAY,hashMap.get(TAG_TUESDAY));
data.put(TAG_WEDNESDAY,hashMap.get(TAG_WEDNESDAY));
data.put(TAG_THURSDAY,hashMap.get(TAG_THURSDAY));
data.put(TAG_FRIDAY,hashMap.get(TAG_FRIDAY));
data.put(TAG_SATURDAY,hashMap.get(TAG_SATURDAY));
data.put(TAG_SUNDAY,hashMap.get(TAG_SUNDAY));
data.put(TAG_TYPE,hashMap.get(TAG_TYPE));
data.put(TAG_NOCAR,hashMap.get(TAG_NOCAR));
// Save this marker data in your previously made HashMap mapped to the marker ID. So you can get it back based on the marker ID
extraMarkerInfo.put(marker.getId(),data);
}
Run Code Online (Sandbox Code Playgroud)
简单选项2只需将整个地图保存在外部变量中即可
for (HashMap<String, String> hashMap : contactList) {
// Create your marker like normal, nothing changes
Marker marker = map.addMarker(new MarkerOptions()
.position(new LatLng(Double.valueOf(hashMap.get(TAG_LAT)) , Double.valueOf(hashMap.get(TAG_LNG))))
.title(hashMap.get(TAG_ADDRESS))
.snippet(hashMap.get(TAG_NAME)));
// Just save the entire json hashmap into the external variable
extraMarkerInfo.put(marker.getId(),hashMap);
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以随时访问extraMarkerInfo,您可以使用标记ID getID()
.
@Override
public void onInfoWindowClick(Marker marker) {
String title = marker.getTitle();
String snippet = marker.getSnippet();
// Get extra data with marker ID
HashMap<String, String> marker_data = extraMarkerInfo.get(marker.getId());
// Getting the data from Map
String location = marker_data.get(TAG_Location);
String company = marker_data.get(TAG_Company);
String place = marker_data.get(TAG_PLACE);
//.. etc etc
}
Run Code Online (Sandbox Code Playgroud)
这只是使用HashMaps的一个小例子,但您可以根据自己的喜好使用不同的解决方案.
归档时间: |
|
查看次数: |
12392 次 |
最近记录: |