1.效果图
2.先导入jar包,可以去官网下载 如图:
特别注意:其中地图和定位还有TabLayout在前面详细说过,这里就不重复了(所以复制全部会报错~)
http://blog.csdn.net/qq_34536167/article/details/75136799 地图定位
http://blog.csdn.net/qq_34536167/article/details/77776278 TabLayout
2.1.MapDemoActivity:
import android.app.ProgressDialog;
import android.graphics.Color;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.MyLocationStyle;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.helloworld.demo.R;
import com.helloworld.demo.MyAdapter;
import com.helloworld.demo.util.LocationUtils;
import com.helloworld.demo.util.Tools;
import com.helloworld.demo.widget.PermissionsUtils;
public class MapDemoActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener,
AMapLocationListener {
private static final String TAG = "MapDemoActivity";
private MapView mMapView;
private ListView listView;
private TabLayout tabLayout;
private AMap aMap;
//判断权限是否打开
private boolean isNeedCheck = true;
private MyLocationStyle myLocationStyle;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
private static final int PERMISSON_REQUESTCODE = 0;
private MyAdapter adapter;
/**
* 查询的类型
*/
private String BANK = "银行";
private String DINING_ROOM = "餐厅";
private String PLOT = "小区";
private String OFFICE_BUILDINGS = "写字楼";
private String BUS_STATION = "公交站";
private String SUBWAY_STATION = "地铁站";
private String LAVATORY = "厕所";
private String SUPERMARKET = "超市";
/**
* 纬度、经度、城市名
*/
private double latitude, longitude;
private String cityName;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_demo);
mMapView = (MapView) this.findViewById(R.id.map);
listView = (ListView) this.findViewById(R.id.listview);
tabLayout = (TabLayout) this.findViewById(R.id.tablayout);
// 此方法须重写,虚拟机需要在很多情况下保存地图绘制的当前状态
mMapView.onCreate(savedInstanceState);
ininview();
initLocation();
}
private void ininview() {
tabLayout.addTab(tabLayout.newTab().setText(DINING_ROOM));
tabLayout.addTab(tabLayout.newTab().setText(BANK));
tabLayout.addTab(tabLayout.newTab().setText(PLOT));
tabLayout.addTab(tabLayout.newTab().setText(OFFICE_BUILDINGS));
tabLayout.addTab(tabLayout.newTab().setText(BUS_STATION));
tabLayout.addTab(tabLayout.newTab().setText(SUBWAY_STATION));
tabLayout.addTab(tabLayout.newTab().setText(LAVATORY));
tabLayout.addTab(tabLayout.newTab().setText(SUPERMARKET));
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
LinearLayout linearLayout = (LinearLayout) tabLayout.getChildAt(0);
linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
linearLayout.setDividerDrawable(ContextCompat.getDrawable(this, R.drawable.layout_divider_vertical));
linearLayout.setDividerPadding(30);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
int selPosition = tab.getPosition();
if (selPosition == 0) {
seartchPoiStart(DINING_ROOM);
} else if (selPosition == 1) {
seartchPoiStart(BANK);
} else if (selPosition == 2) {
seartchPoiStart(PLOT);
} else if (selPosition == 3) {
seartchPoiStart(OFFICE_BUILDINGS);
} else if (selPosition == 4) {
seartchPoiStart(BUS_STATION);
} else if (selPosition == 5) {
seartchPoiStart(SUBWAY_STATION);
} else if (selPosition == 6) {
seartchPoiStart(LAVATORY);
} else {
seartchPoiStart(SUPERMARKET);
}
Log.e(TAG, "onTabSelected: " + selPosition);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void initLocation() {
if (aMap == null) {
aMap = mMapView.getMap();
}
aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {
@Override
public void onMapLoaded() {
aMap.moveCamera(CameraUpdateFactory.zoomTo(16));
}
});
//指南针
aMap.getUiSettings().setCompassEnabled(true);
//显示默认的定位按钮
aMap.getUiSettings().setMyLocationButtonEnabled(true);
//显示实时交通状况(默认地图)
aMap.setTrafficEnabled(true);
//地图模式-标准地图:MAP_TYPE_NORMAL、卫星地图:MAP_TYPE_SATELLITE
aMap.setMapType(AMap.MAP_TYPE_NORMAL);
myLocationStyle = new MyLocationStyle();
//设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
aMap.setMyLocationEnabled(true);
//定位一次,且将视角移动到地图中心点。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);
//设置定位蓝点的Style
aMap.setMyLocationStyle(myLocationStyle);
//动态设置权限
if (isNeedCheck) {
if (PermissionsUtils.checkPermissions(this, PERMISSON_REQUESTCODE, PermissionsUtils.locationPermissions)) {
initaion();
}
} else {
initaion();
}
}
private void initaion() {
//基本的定位参数
mLocationOption = LocationUtils.getDefaultOption();
mLocationClient = LocationUtils.initLocation(this, mLocationOption, this);
//启动定位
mLocationClient.startLocation();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSON_REQUESTCODE) {
if (!PermissionsUtils.verifyPermissions(grantResults)) {
Tools.startAppSettings(this);
isNeedCheck = false;
} else {
initaion();
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mMapView != null) {
mMapView.onSaveInstanceState(outState);
}
}
@Override
protected void onRestart() {
super.onRestart();
//重新绘制加载地图
if (mMapView != null) {
mMapView.onResume();
}
}
@Override
public void onPause() {
super.onPause();
//暂停地图的绘制
if (mMapView != null) {
mMapView.onPause();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mLocationClient != null) {
//停止定位后,本地定位服务并不会被销毁
mLocationClient.stopLocation();
//销毁定位客户端,同时销毁本地定位服务。
mLocationClient.onDestroy();
}
}
/**
* 开始默认查询附近地点
*/
private void seartchPoiStart(String key) {
//创建搜索对象
PoiSearch.Query query = new PoiSearch.Query(key, "", cityName);
//设置每页最多返回多少条poiitem
query.setPageSize(30);
//设置查询页码
query.setPageNum(1);
//构造 PoiSearch 对象,并设置监听。
PoiSearch search = new PoiSearch(this, query);
//设置周边搜索的中心点以及区域 5000米-5公里
search.setBound(new PoiSearch.SearchBound(new LatLonPoint(latitude, longitude), 3000));
search.setOnPoiSearchListener(this);
//开始搜索
search.searchPOIAsyn();
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在查询,请稍后...");
progressDialog.show();
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation.getErrorCode() == 0) {
//停止定位后,本地定位服务并不会被销毁
mLocationClient.stopLocation();
//销毁定位客户端,同时销毁本地定位服务。
mLocationClient.onDestroy();
//更多返回看(文档:http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation)
latitude = amapLocation.getLatitude();//获取纬度
longitude = amapLocation.getLongitude();//获取经度
cityName = amapLocation.getCity();//城市信息
//定位成功在请求附近point 默认餐厅
seartchPoiStart(DINING_ROOM);
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
String str = amapLocation.getErrorInfo();
String[] split = str.split(" ");
//截取第一个空格之前的错误日志
Toast.makeText(this, "定位失败," + split[0], Toast.LENGTH_LONG).show();
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
}
@Override
public void onPoiSearched(final PoiResult poiResult, int i) {
if (progressDialog != null) {
progressDialog.dismiss();
}
//1000为成功,其他失败http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/
if (i == 1000) {
if (poiResult.getPois().size() > 0) {
adapter = new MyAdapter(this, poiResult.getPois());
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//根据当前选中的postion 设置高亮
adapter.setSelectedPosition(position);
adapter.notifyDataSetInvalidated();
//设置点击的标记
setMarkerOptions(poiResult.getPois().get(position).getTitle(), poiResult.getPois().get
(position).getDistance(), poiResult.getPois().get(position).getLatLonPoint()
.getLatitude(), poiResult.getPois().get(position).getLatLonPoint().getLongitude());
}
});
} else {
Toast.makeText(this, "暂无结果", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(this, "搜索失败", Toast.LENGTH_LONG).show();
}
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
/**
* 设置标记
*
* @param name 标记的名称
* @param distance 距离
* @param latitude 纬度
* @param longitude 经度
*/
private void setMarkerOptions(String name, int distance, double latitude, double longitude) {
//在地图上添加一个marker,并将地图中移动至此处
MarkerOptions mk = new MarkerOptions();
//设置定位的图片 (默认)
//本地图片BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(),R.drawable
// .location_marker))
mk.icon(BitmapDescriptorFactory.defaultMarker());
//设置点击的名称
mk.title(name);
//点标记的内容
mk.snippet("距离" + distance + "m");
//点标记是否可拖拽
//mk.draggable(true);
//点标记的锚点
mk.anchor(1.5f, 3.5f);
//点的透明度
//mk.alpha(0.7f);
//设置marker平贴地图效果
mk.setFlat(true);
//设置纬度和经度
LatLng ll = new LatLng(latitude, longitude);
mk.position(ll);
//清除所有marker等,保留自身
aMap.clear(true);
CameraUpdate cu = CameraUpdateFactory.newLatLng(ll);
aMap.animateCamera(cu);
aMap.addMarker(mk);
}
}
2.2.这里用了封装的万能适配器,也可以继承BaseAdapter以前博文也写过
import android.content.Context;
import android.graphics.Color;
import android.widget.TextView;
import com.amap.api.services.core.PoiItem;
import com.helloworld.demo.R;
import com.helloworld.demo.adapter.commonlist.CommonAdapter;
import com.helloworld.demo.adapter.commonlist.ViewHolder;
import com.helloworld.demo.util.Tools;
import java.util.List;
public class MyAdapter extends CommonAdapter<PoiItem> {
private int selectedPosition = -1;
public MyAdapter(Context context, List<PoiItem> datas) {
super(context, R.layout.adapter_item, datas);
}
public void setSelectedPosition(int position) {
selectedPosition = position;
}
@Override
protected void convert(ViewHolder holder, PoiItem poiItem, int position) {
//名称
String name = poiItem.getTitle();
TextView locationName = holder.getView(R.id.location_name);
locationName.setText(Tools.isEmpty(name) ? "-" : name);
//距离
int distance = poiItem.getDistance();
//街道
String snippet = poiItem.getSnippet();
TextView locationInfo = holder.getView(R.id.location_info);
locationInfo.setText(distance + "m | " + snippet);
if (selectedPosition == position) {
locationName.setTextColor(Color.parseColor("#1296db"));
locationInfo.setTextColor(Color.parseColor("#1296db"));
} else {
locationName.setTextColor(Color.parseColor("#444444"));
locationInfo.setTextColor(Color.parseColor("#999999"));
}
}
}
2.3.MapDemoActivity对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff"
android:orientation="vertical">
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4.5"/>
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#f1f1f1"
app:layout_collapseMode="pin"
app:tabIndicatorColor="@color/colorAccent"
app:tabIndicatorHeight="2dp"
app:tabMode="scrollable"
app:tabPadding="5dp"
app:tabSelectedTextColor="@color/colorAccent"
app:tabTextColor="#444444"/>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="6.5"
android:divider="#c9c9c9"
android:dividerHeight="1dp"/>
</LinearLayout>
2.4.MyAdapter对应的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="10dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:layout_weight="8.2"
android:orientation="vertical">
<TextView
android:id="@+id/location_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="1"
android:text="-"
android:textColor="#444444"
android:textSize="15sp"/>
<TextView
android:id="@+id/location_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"
android:textColor="#999999"
android:textSize="12sp"/>
</LinearLayout>
<ImageView
android:id="@+id/location_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"/>
</LinearLayout>
3.交流群:392556366