【发布时间】:2014-12-24 18:39:24
【问题描述】:
我知道我站在正确的地方就我的案例研究寻求帮助,然后几天后我在考虑是否可以使用 Volley 库将数据存储到 MapFragment 但不幸的是直到现在我找不到解决方案。一般 MapFragment 使用 AsycnTask (如果我错了请教我)。为什么我使用 Volley 库,因为完全可以获取/发布数据客户端服务器。您能否给我一些线索或实施如何解决我的问题。提前致谢
public class MapTestFragment extends Fragment {
private static final String TAG = MapTestFragment.class.getSimpleName();
private static final String url = "myurl";
private List<MapEntity> mbList = new ArrayList<MapEntity>();
private GoogleMap googleMap;
static final LatLng Location = new LatLng(-1.782877, 90.381806);
Marker mark;
private MapTestAdapter adapter;
private HashMap<Marker, MapEntity> mMarkersHashMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.fragment_map, container, false);
getLatLang();
mMarkersHashMap = new HashMap<Marker, MapEntity>();
try {
// Loading map
initilizeMap();
plotMarkers(mbList);
} catch (Exception e) {
e.printStackTrace();
}
return rootView;
}
private void getLatLang() {
JsonArrayRequest mapReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
// TODO Auto-generated method stub
Log.d(TAG, response.toString());
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
MapEntity mb = new MapEntity();
mb.setTitle(obj.getString("title"));
mb.setLat(((Number) obj.get("lat"))
.doubleValue());
mb.setLang(((Number) obj.get("lang"))
.doubleValue());
mb.setThumbnail(obj.getString("thumbnail"));
mbList.add(mb);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(mapReq);
}
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment) getActivity().getFragmentManager()
.findFragmentById(R.id.map)).getMap();
if (googleMap != null) {
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
// TODO Auto-generated method stub
marker.showInfoWindow();
return true;
}
});
}
else {
Toast.makeText(getActivity(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}
@Override
public void onResume() {
super.onResume();
initilizeMap();
}
private void plotMarkers(List<MapEntity> mbList)
{
if(mbList.size() > 0)
{
for (MapEntity myMarker : mbList2)
{
// Create user marker with custom icon and other options
MarkerOptions markerOption = new MarkerOptions().
position(new LatLng(myMarker.getLat(),
myMarker.getLang()));
markerOption.icon(BitmapDescriptorFactory.
fromResource(R.drawable.ic_launcher));
Marker currentMarker = googleMap.addMarker(markerOption);
mMarkersHashMap.put(currentMarker, myMarker);
//googleMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
}
}
}
}
public class MapTestAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<MapEntity> mapItems;
private TextView tvTitle, tvLat, tvLang;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public MapTestAdapter(Activity activity,
List<MapEntity> mapItems ) {
super();
this.activity = activity;
this.mapItems = mapItems;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mapItems.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mapItems.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (inflater == null)
inflater = (LayoutInflater)
activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
convertView = inflater.inflate(R.layout.fragment_map_custom_marker, null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
tvTitle = (TextView) convertView.findViewById(R.id.txtTitleMarker);
tvLat = (TextView) convertView.findViewById(R.id.txtLatMarker);
tvLang = (TextView) convertView.findViewById(R.id.txtLangMarker);
NetworkImageView imageshow = (NetworkImageView)
convertView.findViewById(R.id.markerthumnail);
final MapBerau mb = mapItems.get(position);
tvTitle.setText(mb.getTitle());
tvLat.setText(String.valueOf(mb.getLat()));
tvLang.setText(String.valueOf(mb.getLang()));
imageshow.setImageUrl(mb.getThumbnail(), imageLoader);
return convertView;
}
}
【问题讨论】:
-
你遇到了什么问题?
-
通常我在 ListView 上使用 volley,放置列表只需调用 setAdapter。但我不知道如何将列表放入 Marker GoogleMap :)
-
表示您想在地图上显示多个标记?
-
是的,你能帮帮我吗?以上纯属我的代码
-
对我来说,您似乎是在下载数据之前而不是之后调用 plotmarkers()。请记住,下载数据将是异步的,因此它很可能会在您已经调用方法 plotmarkers 后结束。所以你所要做的就是调用 plotMarkers(mbList);下载数据后。
标签: android google-maps android-asynctask android-maps-v2 android-volley