package com.amap.map3d.demo.offlinemap; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.amap.api.maps.AMapException; import com.amap.api.maps.offlinemap.OfflineMapCity; import com.amap.api.maps.offlinemap.OfflineMapManager; import com.amap.api.maps.offlinemap.OfflineMapManager.OfflineLoadedListener; import com.amap.api.maps.offlinemap.OfflineMapManager.OfflineMapDownloadListener; import com.amap.api.maps.offlinemap.OfflineMapProvince; import com.amap.api.maps.offlinemap.OfflineMapStatus; import com.amap.map3d.demo.R; /** * AMapV2地图中简单介绍离线地图下载 */ public class OfflineMapActivity_Old extends Activity implements OfflineMapDownloadListener, OnClickListener, OnPageChangeListener, OfflineLoadedListener { private OfflineMapManager amapManager = null;// 离线地图下载控制器 private List<OfflineMapProvince> provinceList = new ArrayList<OfflineMapProvince>();// 保存一级目录的省直辖市 // private HashMap<Object, List<OfflineMapCity>> cityMap = new // HashMap<Object, List<OfflineMapCity>>();// 保存二级目录的市 private TextView mDownloadText; private TextView mDownloadedText; private ImageView mBackImage; // view pager 两个list以及他们的adapter private ViewPager mContentViewPage; private ExpandableListView mAllOfflineMapList; private ListView mDownLoadedList; private OfflineListAdapter adapter; private OfflineDownloadedAdapter mDownloadedAdapter; private PagerAdapter mPageAdapter; // 刚进入该页面时初始化弹出的dialog private ProgressDialog initDialog; /** * 更新所有列表 */ private final static int UPDATE_LIST = 0; /** * 显示toast log */ private final static int SHOW_MSG = 1; private final static int DISMISS_INIT_DIALOG = 2; private final static int SHOW_INIT_DIALOG = 3; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case UPDATE_LIST: if (mContentViewPage.getCurrentItem() == 0) { ((BaseExpandableListAdapter) adapter) .notifyDataSetChanged(); } else { mDownloadedAdapter.notifyDataChange(); } break; case SHOW_MSG: // Toast.makeText(OfflineMapActivity_Old.this, (String) msg.obj, // Toast.LENGTH_SHORT).show() ToastUtil.showShortToast(OfflineMapActivity_Old.this, (String)msg.obj); break; case DISMISS_INIT_DIALOG: initDialog.dismiss(); handler.sendEmptyMessage(UPDATE_LIST); break; case SHOW_INIT_DIALOG: if (initDialog != null) { initDialog.show(); } break; default: break; } } }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* * 设置离线地图存储目录,在下载离线地图或初始化地图设置; 使用过程中可自行设置, 若自行设置了离线地图存储的路径, * 则需要在离线地图下载和使用地图页面都进行路径设置 */ // Demo中为了其他界面可以使用下载的离线地图,使用默认位置存储,屏蔽了自定义设置 // MapsInitialihenger.sdcardDir =OffLineMapUtils.getSdCacheDir(this); setContentView(R.layout.offline_map_layout); init(); } /** * 方法必须重写 */ @Override protected void onResume() { super.onResume(); } /** * 方法必须重写 */ @Override protected void onPause() { super.onPause(); } /** * 方法必须重写 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } /** * 初始化如果已下载的城市多的话,会比较耗时 */ private void initDialog() { if (initDialog == null) initDialog = new ProgressDialog(this); initDialog.setMessage("正在获取离线城市列表"); initDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); initDialog.setIndeterminate(false); initDialog.setCancelable(false); initDialog.show(); } /** * 隐藏进度框 */ private void dissmissDialog() { if (initDialog != null) { initDialog.dismiss(); } } /** * 初始化UI布局文件 */ private void init() { // 顶部 mDownloadText = (TextView) findViewById(R.id.download_list_text); mDownloadedText = (TextView) findViewById(R.id.downloaded_list_text); mDownloadText.setOnClickListener(this); mDownloadedText.setOnClickListener(this); mBackImage = (ImageView) findViewById(R.id.back_image_view); mBackImage.setOnClickListener(this); // view pager 用到了所有城市list和已下载城市list所有放在最后初始化 mContentViewPage = (ViewPager) findViewById(R.id.content_viewpage); //构造离线地图类 amapManager = new OfflineMapManager(this, this); //离线地图初始化完成监听 amapManager.setOnOfflineLoadedListener(this); initDialog(); } private void initViewpage() { mPageAdapter = new OfflinePagerAdapter(mContentViewPage, mAllOfflineMapList, mDownLoadedList); mContentViewPage.setAdapter(mPageAdapter); mContentViewPage.setCurrentItem(0); mContentViewPage.setOnPageChangeListener(this); } /** * 初始化所有城市列表 */ public void initAllCityList() { // 扩展列表 View provinceContainer = LayoutInflater.from(OfflineMapActivity_Old.this) .inflate(R.layout.offline_province_listview, null); mAllOfflineMapList = (ExpandableListView) provinceContainer .findViewById(R.id.province_download_list); initProvinceListAndCityMap(); // adapter = new OfflineListAdapter(provinceList, cityMap, amapManager, // OfflineMapActivity_Old.this); adapter = new OfflineListAdapter(provinceList, amapManager, OfflineMapActivity_Old.this); // 为列表绑定数据源 mAllOfflineMapList.setAdapter(adapter); // adapter实现了扩展列表的展开与合并监听 mAllOfflineMapList.setOnGroupCollapseListener(adapter); mAllOfflineMapList.setOnGroupExpandListener(adapter); mAllOfflineMapList.setGroupIndicator(null); } /** * sdk内部存放形式为<br> * 省份 - 各自子城市<br> * 北京-北京<br> * ...<br> * 澳门-澳门<br> * 概要图-概要图<br> * <br> * 修改一下存放结构:<br> * 概要图-概要图<br> * 直辖市-四个直辖市<br> * 港澳-澳门香港<br> * 省份-各自子城市<br> */ private void initProvinceListAndCityMap() { List<OfflineMapProvince> lists = amapManager .getOfflineMapProvinceList(); provinceList.add(null); provinceList.add(null); provinceList.add(null); // 添加3个null 以防后面添加出现 index out of bounds ArrayList<OfflineMapCity> cityList = new ArrayList<OfflineMapCity>();// 以市格式保存直辖市、港澳、全国概要图 ArrayList<OfflineMapCity> gangaoList = new ArrayList<OfflineMapCity>();// 保存港澳城市 ArrayList<OfflineMapCity> gaiyaotuList = new ArrayList<OfflineMapCity>();// 保存概要图 for (int i = 0; i < lists.size(); i++) { OfflineMapProvince province = lists.get(i); if (province.getCityList().size() != 1) { // 普通省份 provinceList.add(i + 3, province); // cityMap.put(i + 3, cities); } else { String name = province.getProvinceName(); if (name.contains("香港")) { gangaoList.addAll(province.getCityList()); } else if (name.contains("澳门")) { gangaoList.addAll(province.getCityList()); } else if (name.contains("全国概要图")) { gaiyaotuList.addAll(province.getCityList()); } else { // 直辖市 cityList.addAll(province.getCityList()); } } } // 添加,概要图,直辖市,港口 OfflineMapProvince gaiyaotu = new OfflineMapProvince(); gaiyaotu.setProvinceName("概要图"); gaiyaotu.setCityList(gaiyaotuList); provinceList.set(0, gaiyaotu);// 使用set替换掉刚开始的null OfflineMapProvince zhixiashi = new OfflineMapProvince(); zhixiashi.setProvinceName("直辖市"); zhixiashi.setCityList(cityList); provinceList.set(1, zhixiashi); OfflineMapProvince gaogao = new OfflineMapProvince(); gaogao.setProvinceName("港澳"); gaogao.setCityList(gangaoList); provinceList.set(2, gaogao); // cityMap.put(0, gaiyaotuList);// 在HashMap中第0位置添加全国概要图 // cityMap.put(1, cityList);// 在HashMap中第1位置添加直辖市 // cityMap.put(2, gangaoList);// 在HashMap中第2位置添加港澳 } /** * 初始化已下载列表 */ public void initDownloadedList() { mDownLoadedList = (ListView) LayoutInflater.from( OfflineMapActivity_Old.this).inflate( R.layout.offline_downloaded_list, null); android.widget.AbsListView.LayoutParams params = new android.widget.AbsListView.LayoutParams( android.widget.AbsListView.LayoutParams.MATCH_PARENT, android.widget.AbsListView.LayoutParams.WRAP_CONTENT); mDownLoadedList.setLayoutParams(params); mDownloadedAdapter = new OfflineDownloadedAdapter(this, amapManager); mDownLoadedList.setAdapter(mDownloadedAdapter); } /** * 暂停所有下载和等待 */ private void stopAll() { if (amapManager != null) { amapManager.stop(); } } /** * 继续下载所有暂停中 */ private void startAllInPause() { if (amapManager == null) { return; } for (OfflineMapCity mapCity : amapManager.getDownloadingCityList()) { if (mapCity.getState() == OfflineMapStatus.PAUSE) { try { amapManager.downloadByCityName(mapCity.getCity()); } catch (AMapException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 取消所有<br> * 即:删除下载列表中除了已完成的所有<br> * 会在OfflineMapDownloadListener.onRemove接口中回调是否取消(删除)成功 */ private void cancelAll() { if (amapManager == null) { return; } for (OfflineMapCity mapCity : amapManager.getDownloadingCityList()) { if (mapCity.getState() == OfflineMapStatus.PAUSE) { amapManager.remove(mapCity.getCity()); } } } @Override protected void onDestroy() { super.onDestroy(); if (amapManager != null) { amapManager.destroy(); } if(initDialog != null) { initDialog.dismiss(); initDialog.cancel(); } } private void logList() { ArrayList<OfflineMapCity> list = amapManager.getDownloadingCityList(); for (OfflineMapCity offlineMapCity : list) { Log.i("amap-city-loading: ", offlineMapCity.getCity() + "," + offlineMapCity.getState()); } ArrayList<OfflineMapCity> list1 = amapManager .getDownloadOfflineMapCityList(); for (OfflineMapCity offlineMapCity : list1) { Log.i("amap-city-loaded: ", offlineMapCity.getCity() + "," + offlineMapCity.getState()); } } /** * 离线地图下载回调方法 */ @Override public void onDownload(int status, int completeCode, String downName) { switch (status) { case OfflineMapStatus.SUCCESS: // changeOfflineMapTitle(OfflineMapStatus.SUCCESS, downName); break; case OfflineMapStatus.LOADING: Log.d("amap-download", "download: " + completeCode + "%" + "," + downName); // changeOfflineMapTitle(OfflineMapStatus.LOADING, downName); break; case OfflineMapStatus.UNZIP: Log.d("amap-unzip", "unzip: " + completeCode + "%" + "," + downName); // changeOfflineMapTitle(OfflineMapStatus.UNZIP); // changeOfflineMapTitle(OfflineMapStatus.UNZIP, downName); break; case OfflineMapStatus.WAITING: Log.d("amap-waiting", "WAITING: " + completeCode + "%" + "," + downName); break; case OfflineMapStatus.PAUSE: Log.d("amap-pause", "pause: " + completeCode + "%" + "," + downName); break; case OfflineMapStatus.STOP: break; case OfflineMapStatus.ERROR: Log.e("amap-download", "download: " + " ERROR " + downName); break; case OfflineMapStatus.EXCEPTION_AMAP: Log.e("amap-download", "download: " + " EXCEPTION_AMAP " + downName); break; case OfflineMapStatus.EXCEPTION_NETWORK_LOADING: Log.e("amap-download", "download: " + " EXCEPTION_NETWORK_LOADING " + downName); Toast.makeText(OfflineMapActivity_Old.this, "网络异常", Toast.LENGTH_SHORT) .show(); amapManager.pause(); break; case OfflineMapStatus.EXCEPTION_SDCARD: Log.e("amap-download", "download: " + " EXCEPTION_SDCARD " + downName); break; default: break; } // changeOfflineMapTitle(status, downName); handler.sendEmptyMessage(UPDATE_LIST); } @Override public void onCheckUpdate(boolean hasNew, String name) { // TODO Auto-generated method stub Log.i("amap-demo", "onCheckUpdate " + name + " : " + hasNew); Message message = new Message(); message.what = SHOW_MSG; message.obj = "CheckUpdate " + name + " : " + hasNew; handler.sendMessage(message); } @Override public void onRemove(boolean success, String name, String describe) { // TODO Auto-generated method stub Log.i("amap-demo", "onRemove " + name + " : " + success + " , " + describe); handler.sendEmptyMessage(UPDATE_LIST); Message message = new Message(); message.what = SHOW_MSG; message.obj = "onRemove " + name + " : " + success + " , " + describe; handler.sendMessage(message); } @Override public void onClick(View v) { if (v.equals(mDownloadText)) { int paddingHorizontal = mDownloadText.getPaddingLeft(); int paddingVertical = mDownloadText.getPaddingTop(); mContentViewPage.setCurrentItem(0); mDownloadText .setBackgroundResource(R.drawable.offlinearrow_tab1_pressed); mDownloadedText .setBackgroundResource(R.drawable.offlinearrow_tab2_normal); mDownloadedText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); mDownloadText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); mDownloadedAdapter.notifyDataChange(); } else if (v.equals(mDownloadedText)) { int paddingHorizontal = mDownloadedText.getPaddingLeft(); int paddingVertical = mDownloadedText.getPaddingTop(); mContentViewPage.setCurrentItem(1); mDownloadText .setBackgroundResource(R.drawable.offlinearrow_tab1_normal); mDownloadedText .setBackgroundResource(R.drawable.offlinearrow_tab2_pressed); mDownloadedText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); mDownloadText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); mDownloadedAdapter.notifyDataChange(); } else if (v.equals(mBackImage)) { // 返回 finish(); } } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { int paddingHorizontal = mDownloadedText.getPaddingLeft(); int paddingVertical = mDownloadedText.getPaddingTop(); switch (arg0) { case 0: mDownloadText .setBackgroundResource(R.drawable.offlinearrow_tab1_pressed); mDownloadedText .setBackgroundResource(R.drawable.offlinearrow_tab2_normal); // mPageAdapter.notifyDataSetChanged(); break; case 1: mDownloadText .setBackgroundResource(R.drawable.offlinearrow_tab1_normal); mDownloadedText .setBackgroundResource(R.drawable.offlinearrow_tab2_pressed); // mDownloadedAdapter.notifyDataChange(); break; } handler.sendEmptyMessage(UPDATE_LIST); mDownloadedText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); mDownloadText.setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical); } @Override public void onVerifyComplete() { initAllCityList(); initDownloadedList(); initViewpage(); dissmissDialog(); } }