百度-离线地图

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>

效果:
这里写图片描述
注:更新效果没有尝试.但是实现了这个功能.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值