Acitivity:
public class MapDownLoadActivity extends Activity implements MKOfflineMapListener {
private MKOfflineMap mOffline = null;
/**
* 已下载的离线地图信息列表
*/
private ArrayList<MKOLUpdateElement> localMapList = null;
private LocalMapAdapter lAdapter = null;
private ArrayList<MKOLSearchRecord> allCities;
private ArrayList<MKOLSearchRecord> childCities = new ArrayList<>();
private ListView allCityList;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_down_load);
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
mOffline = new MKOfflineMap();
mOffline.init(this);
initView();
}
private int currentOpenPosition = -1;
private void initView() {
((TextView) findViewById(R.id.back)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
allCityList = (ListView) findViewById(R.id.allcitylist);
// 获取所有支持离线地图的城市
allCities = mOffline.getOfflineCityList();
allCityList.setAdapter(allCitiesAdapter);
allCityList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ArrayList<MKOLSearchRecord> childCitiesList = allCities.get(position).childCities;
if (childCitiesList == null || childCitiesList.size() <= 1) {
start(allCities.get(position).cityID);
currentOpenPosition = -1;
} else {
currentOpenPosition = position;
allCitiesAdapter.notifyDataSetChanged();
allCityList.setSelection(currentOpenPosition);
}
}
});
// 获取已下过的离线地图信息
localMapList = mOffline.getAllUpdateInfo();
if (localMapList == null) {
localMapList = new ArrayList<MKOLUpdateElement>();
}
ListView localMapListView = (ListView) findViewById(R.id.localmaplist);
lAdapter = new LocalMapAdapter();
localMapListView.setAdapter(lAdapter);
// localMapListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// MKOLUpdateElement mkolUpdateElement = localMapList.get(position);
// if (mkolUpdateElement.ratio != 100) {
// if (mkolUpdateElement.status != DOWNLOADING) {
// start(mkolUpdateElement.cityID);
// }else {
// stop(mkolUpdateElement.cityID);
// }
// }
// }
// });
}
private BaseAdapter allCitiesAdapter = new BaseAdapter() {
@Override
public int getCount() {
return allCities.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyAllCitiesHolder holder = null;
if (convertView == null) {
convertView = View.inflate(MapDownLoadActivity.this, R.layout.item_mapoff_list, null);
holder = new MyAllCitiesHolder(convertView);
convertView.setTag(holder);
} else {
holder = (MyAllCitiesHolder) convertView.getTag();
}
if (currentOpenPosition == position) {
childCities.clear();
childCities.addAll(allCities.get(position).childCities);
holder.child_city.setVisibility(View.VISIBLE);
if (holder.child_city.getAdapter() == null) {
holder.child_city.setAdapter(childCitiesAdapter);
}
holder.child_city.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MKOLSearchRecord mkolSearchRecord = MapDownLoadActivity.this.childCities.get(position);
start(mkolSearchRecord.cityID);
}
});
childCitiesAdapter.notifyDataSetChanged();
} else {
holder.child_city.setVisibility(View.GONE);
}
holder.city.setText(allCities.get(position).cityName);
holder.size.setText(formatDataSize(allCities.get(position).size));
return convertView;
}
};
private BaseAdapter childCitiesAdapter = new BaseAdapter() {
@Override
public int getCount() {
return childCities.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyChildCitiesHolder holder = null;
if (convertView == null) {
convertView = View.inflate(MapDownLoadActivity.this, R.layout.item_mapoff_list2, null);
holder = new MyChildCitiesHolder(convertView);
convertView.setTag(holder);
} else {
holder = (MyChildCitiesHolder) convertView.getTag();
}
holder.city.setText(childCities.get(position).cityName);
holder.size.setText(formatDataSize(childCities.get(position).size));
return convertView;
}
};
static class MyChildCitiesHolder {
public TextView city;
public TextView size;
public MyChildCitiesHolder(View view) {
city = (TextView) view.findViewById(R.id.child_city);
size = (TextView) view.findViewById(R.id.child_size);
}
}
static class MyAllCitiesHolder {
public TextView city;
public TextView size;
public MyListView child_city;
public MyAllCitiesHolder(View view) {
city = (TextView) view.findViewById(R.id.city);
size = (TextView) view.findViewById(R.id.size);
child_city = (MyListView) view.findViewById(R.id.child_city);
}
}
/**
* 开始下载
*
* @param cityid
*/
public void start(int cityid) {
cityId = cityid;
mOffline.start(cityid);
updateView();
}
/**
* 暂停下载
*
* @param cityid
*/
public void stop(int cityid) {
boolean pause = mOffline.pause(cityid);
Log.d("task :", "" + pause);
updateView();
}
/**
* 删除离线地图
*
* @param cityid
*/
public void remove(int cityid) {
mOffline.remove(cityid);
updateView();
}
/**
* 启动更新指定城市ID的离线地图
*
* @param cityid
*/
public void update(int cityid) {
mOffline.update(cityid);
updateView();
}
/**
* 更新状态显示
*/
public void updateView() {
localMapList = mOffline.getAllUpdateInfo();
if (localMapList == null) {
localMapList = new ArrayList<MKOLUpdateElement>();
}
lAdapter.notifyDataSetChanged();
}
private int cityId = -1;
@Override
protected void onPause() {
MKOLUpdateElement temp = mOffline.getUpdateInfo(cityId);
if (temp != null && temp.status == DOWNLOADING) {
mOffline.pause(cityId);
}
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}
public String formatDataSize(int size) {
String ret = "";
if (size < (1024 * 1024)) {
ret = String.format("%dK", size / 1024);
} else {
ret = String.format("%.1fM", size / (1024 * 1024.0));
}
return ret;
}
@Override
protected void onDestroy() {
/**
* 退出时,销毁离线地图模块
*/
mOffline.destroy();
super.onDestroy();
currentOpenPosition = -1;
}
@Override
public void onGetOfflineMapState(int type, int state) {
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
MKOLUpdateElement update = mOffline.getUpdateInfo(state);
// 处理下载进度更新提示
if (update != null) {
updateView();
}
}
break;
case MKOfflineMap.TYPE_NEW_OFFLINE:
// 有新离线地图安装
Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
break;
case MKOfflineMap.TYPE_VER_UPDATE:
// 版本更新提示
// MKOLUpdateElement e = mOffline.getUpdateInfo(state);
break;
default:
break;
}
}
public static class ViewHolder {
public View rootView;
public TextView mTitle;
public TextView mUpdate;
public TextView mRatio;
public ImageButton mPause;
public ImageButton mStart;
public ImageButton mUpdates;
public ImageButton mRemove;
public ViewHolder(View rootView) {
this.rootView = rootView;
this.mTitle = (TextView) rootView.findViewById(R.id.title);
this.mUpdate = (TextView) rootView.findViewById(R.id.update);
this.mRatio = (TextView) rootView.findViewById(R.id.ratio);
this.mPause = (ImageButton) rootView.findViewById(R.id.pause);
this.mStart = (ImageButton) rootView.findViewById(R.id.start);
this.mUpdates = (ImageButton) rootView.findViewById(R.id.updates);
this.mRemove = (ImageButton) rootView.findViewById(remove);
}
}
/**
* 离线地图管理列表适配器
*/
public class LocalMapAdapter extends BaseAdapter {
private TextView title;
private ImageButton pause;
private ImageButton start;
private ImageButton updates;
@Override
public int getCount() {
return localMapList.size();
}
@Override
public Object getItem(int index) {
return localMapList.get(index);
}
@Override
public long getItemId(int index) {
return index;
}
@Override
public View getView(int index, View view, ViewGroup arg2) {
ViewHolder holder =null;
if (view == null) {
view = View.inflate(MapDownLoadActivity.this,
R.layout.offline_localmap_list, null);
holder = new ViewHolder(view);
view.setTag(holder);
}else {
holder = (ViewHolder) view.getTag();
}
MKOLUpdateElement e = (MKOLUpdateElement) getItem(index);
initViewItem(holder, e,index);
return view;
}
void initViewItem(ViewHolder holder, final MKOLUpdateElement e, final int index) {
holder.mRatio.setText(e.ratio + "%");
holder.mTitle.setText(e.cityName);
Log.d("status: ", "" + e.status);
switch (e.status) {
case MKOLUpdateElement.FINISHED: //下载完成
holder.mPause.setVisibility(View.INVISIBLE);
holder.mStart.setVisibility(View.INVISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
break;
case MKOLUpdateElement.DOWNLOADING://下载
Log.d("DOWNLOADING", "DOWNLOADING");
holder.mPause.setVisibility(View.VISIBLE);
holder.mStart.setVisibility(View.INVISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
if (e.ratio >= 100) {
holder.mPause.setVisibility(View.INVISIBLE);
}
break;
case MKOLUpdateElement.SUSPENDED: //暂停
holder.mPause.setVisibility(View.INVISIBLE);
holder.mStart.setVisibility(View.VISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
break;
case MKOLUpdateElement.WAITING: //等待下载
holder.mPause.setVisibility(View.VISIBLE);
holder.mStart.setVisibility(View.INVISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
break;
case MKOLUpdateElement.eOLDSInstalling: //离线包正在导入中
holder.mPause.setVisibility(View.INVISIBLE);
holder.mStart.setVisibility(View.INVISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
break;
default:
holder.mPause.setVisibility(View.INVISIBLE);
holder.mStart.setVisibility(View.VISIBLE);
holder.mUpdates.setVisibility(View.INVISIBLE);
break;
}
if (e.update) {
holder.mUpdate.setText("可更新");
} else {
holder.mUpdate.setText("最新");
}
holder.mPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickBt(v,index);
}
});
holder.mStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickBt(v,index);
}
});
holder.mUpdates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mClickBt(v,index);
}
});
holder.mRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mOffline.remove(e.cityID);
updateView();
}
});
}
private void mClickBt(View v,int index){
int cityID = localMapList.get(index).cityID;
switch (v.getId()) {
case R.id.start:
start(cityID);
updateView();
break;
case R.id.pause:
stop(cityID);
updateView();
break;
case R.id.updates:
update(cityID);
updateView();
break;
}
}
}
}
xmml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:background="@drawable/bg_toolbar"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/action_bar_height"
android:background="@drawable/bg_toolbar">
<TextView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:background="@null"
android:drawableLeft="@drawable/ic_left"
android:drawablePadding="5dp"
android:gravity="center"
android:text="返回"
android:textColor="@color/cardview_light_background"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="离线下载"
android:textColor="@color/cardview_light_background"
android:textSize="@dimen/content_big_textsize" />
</RelativeLayout>
<LinearLayout
android:id="@+id/citylist_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/common_action_bar_splitter"
android:paddingBottom="4dp"
android:paddingLeft="10dp"
android:paddingTop="4dp"
android:text="热门城市" />
<ListView
android:id="@+id/allcitylist"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/common_action_bar_splitter"
android:paddingBottom="4dp"
android:paddingLeft="10dp"
android:paddingTop="4dp"
android:text="已下载" />
<ListView
android:id="@+id/localmaplist"
android:layout_width="fill_parent"
android:layout_height="180dp" />
</LinearLayout>
</LinearLayout>
效果:
注:更新效果没有尝试.但是实现了这个功能.