content: package com.amapv2.apis.busline;
  
  import java.util.List;
  
  import android.app.Activity;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.content.Context;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.AdapterView;
  import android.widget.AdapterView.OnItemClickListener;
  import android.widget.AdapterView.OnItemSelectedListener;
  import android.widget.ArrayAdapter;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.ListView;
  import android.widget.Spinner;
  
  import com.amap.api.maps.AMap;
  import com.amap.api.maps.AMap.InfoWindowAdapter;
  import com.amap.api.maps.AMap.OnMarkerClickListener;
  import com.amap.api.maps.MapView;
  import com.amap.api.maps.model.Marker;
  import com.amap.api.maps.overlay.BusLineOverlay;
  import com.amap.api.services.busline.BusLineItem;
  import com.amap.api.services.busline.BusLineQuery;
  import com.amap.api.services.busline.BusLineQuery.SearchType;
  import com.amap.api.services.busline.BusLineResult;
  import com.amap.api.services.busline.BusLineSearch;
  import com.amap.api.services.busline.BusLineSearch.OnBusLineSearchListener;
  import com.amap.api.services.busline.BusStationItem;
  import com.amap.api.services.busline.BusStationQuery;
  import com.amap.api.services.busline.BusStationResult;
  import com.amap.api.services.busline.BusStationSearch.OnBusStationSearchListener;
  import com.amapv2.apis.R;
  import com.amapv2.apis.util.ToastUtil;
  
  /**
   * AMapV2地图中简单介绍公交线路搜索
   */
  public class BuslineActivity extends Activity implements OnMarkerClickListener,
  		InfoWindowAdapter, OnItemSelectedListener, OnBusLineSearchListener,
  		OnBusStationSearchListener, OnClickListener {
  	private AMap aMap;
  	private MapView mapView;
  	private ProgressDialog progDialog = null;// 进度框
  	private EditText searchName;// 输入公交线路名称
  	private Spinner selectCity;// 选择城市下拉列表
  	private String[] itemCitys = { "北京-010", "郑州-0371", "上海-021" };
  	private String cityCode = "";// 城市区号
  	private int currentpage = 0;// 公交搜索当前页，第一页从0开始
  	private BusLineResult busLineResult;// 公交线路搜索返回的结果
  	private List<BusLineItem> lineItems = null;// 公交线路搜索返回的busline
  	private BusLineQuery busLineQuery;// 公交线路查询的查询类
  
  	private BusStationResult busStationResult;// 公交站点搜索返回的结果
  	private List<BusStationItem> stationItems;// 公交站点搜索返回的busStation
  	private BusStationQuery busStationQuery;// 公交站点查询的查询类
  
  	private BusLineSearch busLineSearch;// 公交线路列表查询
  
  	@Override
  	protected void onCreate(Bundle bundle) {
  		super.onCreate(bundle);
  		setContentView(R.layout.busline_activity);
          /*
           * 设置离线地图存储目录，在下载离线地图或初始化地图设置;
           * 使用过程中可自行设置, 若自行设置了离线地图存储的路径，
           * 则需要在离线地图下载和使用地图页面都进行路径设置
           * */
  	    //Demo中为了其他界面可以使用下载的离线地图，使用默认位置存储，屏蔽了自定义设置
  //        MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);
  		mapView = (MapView) findViewById(R.id.map);
  		mapView.onCreate(bundle);// 此方法必须重写
  		init();
  	}
  
  	/**
  	 * 初始化AMap对象
  	 */
  	private void init() {
  		if (aMap == null) {
  			aMap = mapView.getMap();
  			setUpMap();
  		}
  		Button searchByName = (Button) findViewById(R.id.searchbyname);
  		searchByName.setOnClickListener(this);
  		selectCity = (Spinner) findViewById(R.id.cityName);
  		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  				android.R.layout.simple_spinner_item, itemCitys);
  		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  		selectCity.setAdapter(adapter);
  		selectCity.setPrompt("请选择城市：");
  		selectCity.setOnItemSelectedListener(this);
  		searchName = (EditText) findViewById(R.id.busName);
  	}
  
  	/**
  	 * 设置marker的监听和信息窗口的监听
  	 */
  	private void setUpMap() {
  		aMap.setOnMarkerClickListener(this);
  		aMap.setInfoWindowAdapter(this);
  	}
  
  	/**
  	 * 方法必须重写
  	 */
  	@Override
  	protected void onResume() {
  		super.onResume();
  		mapView.onResume();
  	}
  
  	/**
  	 * 方法必须重写
  	 */
  	@Override
  	protected void onPause() {
  		super.onPause();
  		mapView.onPause();
  	}
  
  	/**
  	 * 方法必须重写
  	 */
  	@Override
  	protected void onSaveInstanceState(Bundle outState) {
  		super.onSaveInstanceState(outState);
  		mapView.onSaveInstanceState(outState);
  	}
  
  	/**
  	 * 方法必须重写
  	 */
  	@Override
  	protected void onDestroy() {
  		super.onDestroy();
  		mapView.onDestroy();
  	}
  
  	/**
  	 * 公交线路搜索
  	 */
  	public void searchLine() {
  		currentpage = 0;// 第一页默认从0开始
  		showProgressDialog();
  		String search = searchName.getText().toString().trim();
  		if ("".equals(search)) {
  			search = "641";
  			searchName.setText(search);
  		}
  		busLineQuery = new BusLineQuery(search, SearchType.BY_LINE_NAME,
  				cityCode);// 第一个参数表示公交线路名，第二个参数表示公交线路查询，第三个参数表示所在城市名或者城市区号
  		busLineQuery.setPageSize(10);// 设置每页返回多少条数据
  		busLineQuery.setPageNumber(currentpage);// 设置查询第几页，第一页从0开始算起
  		busLineSearch = new BusLineSearch(this, busLineQuery);// 设置条件
  		busLineSearch.setOnBusLineSearchListener(this);// 设置查询结果的监听
  		busLineSearch.searchBusLineAsyn();// 异步查询公交线路名称
  		// 公交站点搜索事例
  		/*
  		 * BusStationQuery query = new BusStationQuery(search,cityCode);
  		 * query.setPageSize(10); query.setPageNumber(currentpage);
  		 * BusStationSearch busStationSearch = new BusStationSearch(this,query);
  		 * busStationSearch.setOnBusStationSearchListener(this);
  		 * busStationSearch.searchBusStationAsyn();
  		 */
  	}
  
  	/**
  	 * 显示进度框
  	 */
  	private void showProgressDialog() {
  		if (progDialog == null)
  			progDialog = new ProgressDialog(this);
  		progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  		progDialog.setIndeterminate(false);
  		progDialog.setCancelable(true);
  		progDialog.setMessage("正在搜索:\n");
  		progDialog.show();
  	}
  
  	/**
  	 * 隐藏进度框
  	 */
  	private void dissmissProgressDialog() {
  		if (progDialog != null) {
  			progDialog.dismiss();
  		}
  	}
  
  	/**
  	 * 提供一个给默认信息窗口定制内容的方法
  	 */
  	@Override
  	public View getInfoContents(Marker marker) {
  		return null;
  	}
  
  	/**
  	 * 提供一个个性化定制信息窗口的方法
  	 */
  	@Override
  	public View getInfoWindow(Marker marker) {
  		return null;
  	}
  
  	/**
  	 * 点击marker回调函数
  	 */
  	@Override
  	public boolean onMarkerClick(Marker marker) {
  		return false;// 点击marker时把此marker显示在地图中心点
  	}
  
  	/**
  	 * 选择城市
  	 */
  	@Override
  	public void onItemSelected(AdapterView<?> parent, View view, int position,
  			long id) {
  		String cityString = itemCitys[position];
  		cityCode = cityString.substring(cityString.indexOf("-") + 1);
  	}
  
  	@Override
  	public void onNothingSelected(AdapterView<?> arg0) {
  		cityCode = "010";
  	}
  
  	/**
  	 * 公交线路搜索返回的结果显示在dialog中
  	 */
  	public void showResultList(List<BusLineItem> busLineItems) {
  		BusLineDialog busLineDialog = new BusLineDialog(this, busLineItems);
  		busLineDialog.onListItemClicklistener(new OnListItemlistener() {
  			@Override
  			public void onListItemClick(BusLineDialog dialog,
  					final BusLineItem item) {
  				showProgressDialog();
  
  				String lineId = item.getBusLineId();// 得到当前点击item公交线路id
  				busLineQuery = new BusLineQuery(lineId, SearchType.BY_LINE_ID,
  						cityCode);// 第一个参数表示公交线路id，第二个参数表示公交线路id查询，第三个参数表示所在城市名或者城市区号
  				BusLineSearch busLineSearch = new BusLineSearch(
  						BuslineActivity.this, busLineQuery);
  				busLineSearch.setOnBusLineSearchListener(BuslineActivity.this);
  				busLineSearch.searchBusLineAsyn();// 异步查询公交线路id
  			}
  		});
  		busLineDialog.show();
  
  	}
  
  	interface OnListItemlistener {
  		public void onListItemClick(BusLineDialog dialog, BusLineItem item);
  	}
  
  	/**
  	 * 所有公交线路显示页面
  	 */
  	class BusLineDialog extends Dialog implements OnClickListener {
  
  		private List<BusLineItem> busLineItems;
  		private BusLineAdapter busLineAdapter;
  		private Button preButton, nextButton;
  		private ListView listView;
  		protected OnListItemlistener onListItemlistener;
  
  		public BusLineDialog(Context context, int theme) {
  			super(context, theme);
  		}
  
  		public void onListItemClicklistener(
  				OnListItemlistener onListItemlistener) {
  			this.onListItemlistener = onListItemlistener;
  
  		}
  
  		public BusLineDialog(Context context, List<BusLineItem> busLineItems) {
  			this(context, android.R.style.Theme_NoTitleBar);
  			this.busLineItems = busLineItems;
  			busLineAdapter = new BusLineAdapter(context, busLineItems);
  		}
  
  		@Override
  		protected void onCreate(Bundle savedInstanceState) {
  			super.onCreate(savedInstanceState);
  			setContentView(R.layout.busline_dialog);
  			preButton = (Button) findViewById(R.id.preButton);
  			nextButton = (Button) findViewById(R.id.nextButton);
  			listView = (ListView) findViewById(R.id.listview);
  			listView.setAdapter(busLineAdapter);
  			listView.setOnItemClickListener(new OnItemClickListener() {
  
  				@Override
  				public void onItemClick(AdapterView<?> arg0, View arg1,
  						int arg2, long arg3) {
  					onListItemlistener.onListItemClick(BusLineDialog.this,
  							busLineItems.get(arg2));
  					dismiss();
  
  				}
  			});
  			preButton.setOnClickListener(this);
  			nextButton.setOnClickListener(this);
  			if (currentpage <= 0) {
  				preButton.setEnabled(false);
  			}
  			if (currentpage >= busLineResult.getPageCount() - 1) {
  				nextButton.setEnabled(false);
  			}
  
  		}
  
  		@Override
  		public void onClick(View v) {
  			this.dismiss();
  			if (v.equals(preButton)) {
  				currentpage--;
  			} else if (v.equals(nextButton)) {
  				currentpage++;
  			}
  			showProgressDialog();
  			busLineQuery.setPageNumber(currentpage);// 设置公交查询第几页
  			busLineSearch.setOnBusLineSearchListener(BuslineActivity.this);
  			busLineSearch.searchBusLineAsyn();// 异步查询公交线路名称
  		}
  	}
  
  	/**
  	 * 公交站点查询结果回调
  	 */
  	@Override
  	public void onBusStationSearched(BusStationResult result, int rCode) {
  		dissmissProgressDialog();
  		if (rCode == 0) {
  			if (result != null && result.getPageCount() > 0
  					&& result.getBusStations() != null
  					&& result.getBusStations().size() > 0) {
  				busStationResult = result;
  				stationItems = result.getBusStations();
  			} else {
  				ToastUtil.show(BuslineActivity.this, R.string.no_result);
  			}
  		} else if (rCode == 27) {
  			ToastUtil.show(BuslineActivity.this, R.string.error_network);
  		} else if (rCode == 32) {
  			ToastUtil.show(BuslineActivity.this, R.string.error_key);
  		} else {
  			ToastUtil.show(BuslineActivity.this, R.string.error_other);
  		}
  	}
  
  	/**
  	 * 公交线路查询结果回调
  	 */
  	@Override
  	public void onBusLineSearched(BusLineResult result, int rCode) {
  		dissmissProgressDialog();
  		if (rCode == 0) {
  			if (result != null && result.getQuery() != null
  					&& result.getQuery().equals(busLineQuery)) {
  				if (result.getQuery().getCategory() == SearchType.BY_LINE_NAME) {
  					if (result.getPageCount() > 0
  							&& result.getBusLines() != null
  							&& result.getBusLines().size() > 0) {
  						busLineResult = result;
  						lineItems = result.getBusLines();
  						showResultList(lineItems);
  					}
  				} else if (result.getQuery().getCategory() == SearchType.BY_LINE_ID) {
  					aMap.clear();// 清理地图上的marker
  					busLineResult = result;
  					lineItems = busLineResult.getBusLines();
  					BusLineOverlay busLineOverlay = new BusLineOverlay(this,
  							aMap, lineItems.get(0));
  					busLineOverlay.removeFromMap();
  					busLineOverlay.addToMap();
  					busLineOverlay.zoomToSpan();
  				}
  			} else {
  				
  				ToastUtil.show(BuslineActivity.this, R.string.no_result);
  			}
  		} else if (rCode == 27) {
  			ToastUtil.show(BuslineActivity.this, R.string.error_network);
  		} else if (rCode == 32) {
  			ToastUtil.show(BuslineActivity.this, R.string.error_key);
  		} else {
  			ToastUtil.show(BuslineActivity.this, R.string.error_other);
  		}
  	}
  
  	/**
  	 * 查询公交线路
  	 */
  	@Override
  	public void onClick(View v) {
  		searchLine();
  	}
  }
  