package cn.locationbox.jtan.mvp.map;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener;
import com.baidu.mapapi.search.sug.SuggestionResult;
import com.baidu.mapapi.search.sug.SuggestionSearch;
import com.baidu.mapapi.search.sug.SuggestionSearchOption;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.locationbox.jtan.R;
import cn.locationbox.jtan.base.BaseActivity;
import jtan.com.core.util.SpUtil;
public class MapActivity extends BaseActivity implements BDLocationListener, BaiduMap.OnMapStatusChangeListener {
private MapView mMapView;
private BaiduMap mBaiduMap;
//POI list
private ListView lv_near_address;
//选择城市
private TextView select_city;
//地图显示
private LinearLayout map_area;
//搜索框
private LinearLayout search_box, search_box_true;
//搜索关键字输入框
private EditText search_address;
//建议查询列表
private ListView search_list;
//建议查询
private SuggestionSearch mSuggestionSearch;
//搜索的列表adapter
private SuggestionAdapter mAdapter;
// private String poiCity;
// private String poiDistrict;
//搜索数据源
private List<String> mListCitys = new ArrayList<>();
private List<String> mListKeys = new ArrayList<>();
private List<PoiDetailResult> mListInfos = new ArrayList<>();
// private List<PoiInfo> mListInfos;
//进行反地理编码
private GeoCoder geoCoder;
//是否第一次定位
private boolean IsFirstLoc = true;
// 地图状态改变,移动地图,更改城市
private boolean IsFirstCity = true;
// 定位
public LocationClient mLocationClient = null;
//定位设置
private MyLocationConfiguration.LocationMode mCurrentMode;
//当前城市
private String currentCity;
//当前区
private String district;
//POI检索
// private PoiSearch mPoiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_map);
initView();
initMap();
imm = (InputMethodManager) MapActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
}
private void initMap() {
// 在线建议查询(搜索框)
mSuggestionSearch = SuggestionSearch.newInstance();
mSuggestionSearch.setOnGetSuggestionResultListener(new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
if (suggestionResult == null || suggestionResult.getAllSuggestions() == null) {
return;
} else {
mListKeys.clear();
mListCitys.clear();
mListInfos.clear();
//获取详细信息
for (SuggestionResult.SuggestionInfo info : suggestionResult.getAllSuggestions()) {
mListKeys.add(info.key);
mListCitys.add(info.city + info.district);
PoiSearch poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
Log.i("=====", "onGetPoiDetailResult: " + poiDetailResult.uid);
// 获取Place详情页检索结果
if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
Log.i("===", "onGetPoiDetailResult: " + poiDetailResult.error);
//详情检索失败
// result.error请参考SearchResult.ERRORNO
} else {
mListInfos.add(poiDetailResult);
mAdapter.notifyDataSetChanged();
}
//
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
});
Log.i("===", "onGetSuggestionResult: " + info.uid);
poiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(info.uid));
}
}
}
});
//----------------------基础地图设置----------------------
//将地图放大
MapStatus mapstatus = new MapStatus.Builder().zoom(15).build();
MapStatusUpdate mapupdate = MapStatusUpdateFactory.newMapStatus(mapstatus);
mBaiduMap.setMapStatus(mapupdate);
// 地图状态改变相关监听
mBaiduMap.setOnMapStatusChangeListener(this);
//定位获取周边信息
geoCoder = GeoCoder.newInstance(); //GeoCoder对象的实例化
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
}
// 拿到变化地点后的附近地址
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
district = reverseGeoCodeResult.getAddressDetail().district;
final List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();
if (poiInfos != null && !"".equals(poiInfos)) {
PoiAdapter poiAdapter = new PoiAdapter(poiInfos);
lv_near_address.setAdapter(poiAdapter);
lv_near_address.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MapActivity.this, FinishActivity.class);
startActivity(intent);
finish();
}
});
}
}
});
initLocation();
}
private void initLocation() {
//----------------------地图定位----------------------
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位图层显示方式
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
mLocationClient = new LocationClient(this);
// 注册定位监听
mLocationClient.registerLocationListener(this);
// 定位选项
LocationClientOption option = new LocationClientOption();
/**
* coorType - 取值有3个: 返回国测局经纬度坐标系:gcj02 返回百度墨卡托坐标系 :bd09 返回百度经纬度坐标系
* :bd09ll
*/
option.setCoorType("bd09ll");
// 设置是否需要地址信息,默认为无地址
option.setIsNeedAddress(true);
// 设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近",
// 可以用作地址信息的补充
option.setIsNeedLocationDescribe(true);
// 设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
option.setIsNeedLocationPoiList(true);
/**
* 设置定位模式 Battery_Saving 低功耗模式 Device_Sensors 仅设备(Gps)模式 Hight_Accuracy
* 高精度模式
*/
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 设置是否打开gps进行定位
option.setOpenGps(true);
// 设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
option.setScanSpan(1000);
// 设置 LocationClientOption
mLocationClient.setLocOption(option);
IsFirstCity = true;
// 开始定位
mLocationClient.start();
}
private void initView() {
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
lv_near_address = (ListView) findViewById(R.id.lv_near_address);
select_city = (TextView) findViewById(R.id.select_city);
map_area = (LinearLayout) findViewById(R.id.map_area);
search_list = (ListView) findViewById(R.id.search_list);
search_box = (LinearLayout) findViewById(R.id.search_box);
search_box_true = (LinearLayout) findViewById(R.id.search_box_true);
search_address = (EditText) findViewById(R.id.search_address);
//搜索绑定adapter
mAdapter = new SuggestionAdapter(mListCitys, mListKeys, mListInfos);
search_list.setAdapter(mAdapter);
search_address.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() <= 0) {
return;
} else {
// /**
// * 使用POI检索关键字
// */
// mPoiSearch.searchInCity(new PoiCitySearchOption().city(currentCity).keyword(s.toString()).pageNum(30));
// 在线建议查询
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
.keyword(s.toString())
.city(currentCity));
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
search_address.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
return (event.getKeyCode() == KeyEvent.KEYCODE_ENTER);
}
});
search_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MapActivity.this, FinishActivity.class);
intent.putExtra("city", mListCitys.get(position));
intent.putExtra("selectAddress", mListInfos.get(position).getAddress());
intent.putExtra("lat", mListInfos.get(position).getLocation().latitude);
intent.putExtra("lon", mListInfos.get(position).getLocation().longitude);
startActivity(intent);
finish();
}
});
}
private InputMethodManager imm;
public void ClickView(View view) {
switch (view.getId()) {
case R.id.back:
finish();
break;
case R.id.select_city:
Intent intent = new Intent(MapActivity.this, CityActivity.class);
intent.putExtra("city", select_city.getText().toString());
startActivityForResult(intent, 200);
break;
//点击搜索展示框
case R.id.search_box:
//展示不显示,地图不显示,显示列表
search_box.setVisibility(View.INVISIBLE);
search_box_true.setVisibility(View.VISIBLE);
map_area.setVisibility(View.INVISIBLE);
search_list.setVisibility(View.VISIBLE);
// 获取编辑框焦点
search_address.setFocusable(true);
//打开软键盘
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
search_address.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
//TODO
return true;
}
return false;
}
}
);
//进行关键字检索
break;
//取消
case R.id.cancel:
search_address.setText("");
// search_address.setFocusable(false);
//关闭软键盘
imm.hideSoftInputFromWindow(search_address.getWindowToken(), 0);
mListCitys.clear();
// mListInfos.clear();
mListKeys.clear();
mAdapter.notifyDataSetChanged();
search_box_true.setVisibility(View.INVISIBLE);
search_box.setVisibility(View.VISIBLE);
map_area.setVisibility(View.VISIBLE);
search_list.setVisibility(View.INVISIBLE);
break;
case R.id.deleteText:
search_address.setText("");
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 200) {
if (resultCode == 200) {
String city = data.getStringExtra("city");
float lat = data.getFloatExtra("lat", 0);
float lon = data.getFloatExtra("lon", 0);
select_city.setText(city);
LatLng point = new LatLng(lat, lon);
MapStatus mMapStatus = new MapStatus.Builder()
.target(point)
.zoom(16)
.build();
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
// 发起反地理编码请求(经纬度->地址信息)
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
// 设置反地理编码位置坐标
reverseGeoCodeOption.location(point);
geoCoder.reverseGeoCode(reverseGeoCodeOption);
}
if (resultCode == 400) {
IsFirstLoc = true;
IsFirstCity = true;
// 开始定位
mLocationClient.start();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
//BDLocationListener 监听
@Override
public void onReceiveLocation(BDLocation location) {
// 如果bdLocation为空或mapView销毁后不再处理新数据接收的位置
if (location == null || mBaiduMap == null) {
return;
}
LatLng point = new LatLng(location.getLatitude(), location.getLongitude());
// 获取城市,待会用于POISearch
currentCity = location.getCity();
select_city.setText(currentCity);
// 是否是第一次定位
if (IsFirstLoc) {
IsFirstLoc = false;
//定义地图状态
MapStatus mMapStatus = new MapStatus.Builder()
.target(point)
.zoom(16)
.build();
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
// 发起反地理编码请求(经纬度->地址信息)
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
// 设置反地理编码位置坐标
reverseGeoCodeOption.location(point);
geoCoder.reverseGeoCode(reverseGeoCodeOption);
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
//OnMapStatusChangeListener
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
if (IsFirstCity) {
IsFirstCity = false;
select_city.setText(currentCity);
}
// 地图操作的中心点
LatLng cenpt = mapStatus.target;
geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));
}
class SuggestionAdapter extends BaseAdapter {
private List<String> mKeys;//key
private List<String> mCitys;//city
private List<PoiDetailResult> mListInfos;
public SuggestionAdapter(List<String> citys, List<String> keys, List<PoiDetailResult> infos) {
this.mKeys = keys;
this.mCitys = citys;
this.mListInfos = infos;
}
@Override
public int getCount() {
return mListInfos.size();
}
@Override
public Object getItem(int position) {
return mListInfos.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_poi, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.area.setText(mKeys.get(position));
holder.address.setText(mListInfos.get(position).getAddress());
return convertView;
}
}
class PoiAdapter extends BaseAdapter {
private List<PoiInfo> pois;
public PoiAdapter(List<PoiInfo> pois) {
this.pois = pois;
}
@Override
public int getCount() {
return pois.size();
}
@Override
public Object getItem(int position) {
return pois.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_poi, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (position == 0) {
holder.isFirst.setVisibility(View.VISIBLE);
holder.address.setTextColor(Color.parseColor("#5C6361"));
} else {
holder.isFirst.setVisibility(View.GONE);
holder.address.setTextColor(Color.parseColor("#999999"));
}
PoiInfo poiInfo = pois.get(position);
holder.area.setText(poiInfo.name);
holder.address.setText(poiInfo.address);
return convertView;
}
}
class ViewHolder {
TextView isFirst;
TextView area;
TextView address;
ViewHolder(View view) {
isFirst = (TextView) view.findViewById(R.id.isFirst);
area = (TextView) view.findViewById(R.id.area);
address = (TextView) view.findViewById(R.id.address);
}
}
}
点击城市切换
package cn.locationbox.jtan.mvp.map;
import android.content.Intent;
import android.content.res.XmlResourceParser;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.zhy.autolayout.utils.AutoUtils;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import cn.locationbox.jtan.R;
import cn.locationbox.jtan.base.BaseActivity;
import cn.locationbox.jtan.bean.City;
import cn.locationbox.jtan.util.PinYinUtil;
import jtan.com.core.util.SpUtil;
import static android.R.attr.data;
/**
* Created by lfyan on 2017/5/9.
*/
public class CityActivity extends BaseActivity {
// String g
private List<City> mCitys = new ArrayList<>();
private String[] letter = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
//城市
private List<City> mListCity;
//字母
private List<String> mListLetter;
ListView lv; // 城市列表
ListView lv1; //字母列表
private List<Object> cityToLetter = new ArrayList<>();
private TextView select_city;
private LinearLayout search_box, search_box_true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city);
initData();
handleData();
initView();
lv = (ListView) findViewById(R.id.listView1);
View headerView = LayoutInflater.from(mContext).inflate(R.layout.current_city, null);
TextView locationImg = (TextView) headerView.findViewById(R.id.locationImg);
locationImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
setResult(400, intent);
finish();
}
});
TextView current_city = (TextView) headerView.findViewById(R.id.current_city);
lv.addHeaderView(headerView);
lv.setAdapter(new MyAdapter());
lv1 = (ListView) findViewById(R.id.listView2);
lv1.setAdapter(new MyAdapter1());
lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// lv1.setBackgroundColor(Color.parseColor("#12000000"));
for (int i = 0; i < cityToLetter.size(); i++) {
if (letter[position].equals(cityToLetter.get(i))) {
lv.setSelection(i + 1);
break;
}
}
}
});
String city = getIntent().getStringExtra("city");
current_city.setText(city);
}
private void handleData() {
for (int i = 0; i < mListLetter.size(); i++) {
boolean isAddLetter = false;
for (int j = 0; j < mListCity.size(); j++) {
if (mListCity.get(j).getFirstPinyin().equals(mListLetter.get(i))) {
if (isAddLetter == false) {
cityToLetter.add(mListLetter.get(i));
isAddLetter = true;
}
cityToLetter.add(mListCity.get(j));
}
}
}
}
private void initData() {
//得到资源中的数据流
String fileName = "citys.xml"; //文件名字
List<City> citys = null;
City city = null;
try {
InputStream inputStream = getResources().getAssets().open(fileName);
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
int event = parser.getEventType();//产生第一个事件
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件
citys = new ArrayList<City>();//初始化books集合
break;
case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件
if ("city".equals(parser.getName())) {//判断开始标签元素是否是book
city = new City();
// city.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id
}
if (city != null) {
if ("name".equals(parser.getName())) {//判断开始标签元素是否是name
city.setName(parser.nextText());
} else if ("lat".equals(parser.getName())) {//判断开始标签元素是否是price
city.setLat(Float.parseFloat(parser.nextText()));
} else if ("lon".equals(parser.getName())) {
city.setLon(Float.parseFloat(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件
if ("city".equals(parser.getName())) {//判断结束标签元素是否是book
citys.add(city);//将book添加到books集合
city = null;
}
break;
}
event = parser.next();//进入下一个元素并触发相应事件
}//end while
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < citys.size(); i++) {
String pinyin = PinYinUtil.getPingYin(citys.get(i).getName());
String Fpinyin = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (Fpinyin.matches("[A-Z]")) {
citys.get(i).setFirstPinyin(Fpinyin);
} else {
citys.get(i).setFirstPinyin("#");
}
}
List<City> sortCitys = new ArrayList<>();
List<String> sortLetter = new ArrayList<>();
for (int j = 0; j < letter.length; j++) {
boolean isHaveLetter = false;
for (int i = 0; i < citys.size(); i++) {
if (citys.get(i).getFirstPinyin().equals(letter[j])) {
sortCitys.add(citys.get(i));
isHaveLetter = true;
}
}
if (isHaveLetter) {
sortLetter.add(letter[j]);
}
}
mListCity = sortCitys;
mListLetter = sortLetter;
}
private void initView() {
select_city = (TextView) findViewById(R.id.select_city);
String city = getIntent().getStringExtra("city");
select_city.setText(city);
}
class MyAdapter1 extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return letter.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return letter[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(CityActivity.this).inflate(R.layout.letter_list, null);
// convertView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
Toast.makeText(mContext, letter[position], Toast.LENGTH_SHORT).show();
//
// }
// });
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.letterListTextView.setText(letter[position]);
return convertView;
}
}
class MyAdapter extends BaseAdapter {
final static int TYPE_1 = 1;
final static int TYPE_2 = 2;
@Override
public int getCount() {
return cityToLetter.size();
}
@Override
public Object getItem(int position) {
return cityToLetter.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
for (int i = 0; i < letter.length; i++) {
if (cityToLetter.get(position).equals(letter[i])) {
return TYPE_1;
}
}
return TYPE_2;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
/**
* 即使convertView缓存了一些布局,但是在重构时,根本不知道怎么样去让convertView返回你所需要的布局,这时你需
* 要让adapter知道我当前有哪些布局,我重构Item时的布局选取规则,好让convertView能返回你需要的布局。
* 需要重写以下两个函数
* @Override
* public int getItemViewType(int position) {}这个函数获取在getView中创建的视图的类型
* @Override
* public int getViewTypeCount() {}返回在getView中创建视图类型的数量
* 至于这两个方法的详细用处,自己看api即可
*/
int type = getItemViewType(position);
switch (type) {
case TYPE_1:
convertView = LayoutInflater.from(CityActivity.this).inflate(R.layout.letter, null);
AutoUtils.autoSize(convertView);
TextView tv = (TextView) convertView.findViewById(R.id.letterTextView);
tv.setText((String) cityToLetter.get(position));
break;
case TYPE_2:
convertView = LayoutInflater.from(CityActivity.this).inflate(R.layout.city, null);
AutoUtils.autoSize(convertView);
TextView tv2 = (TextView) convertView.findViewById(R.id.cityTextView);
tv2.setText(((City) cityToLetter.get(position)).getName());
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
setResult(200, intent);
finish();
}
});
break;
default:
break;
}
return convertView;
}
}
public void ClickView(View view) {
switch (view.getId()) {
case R.id.iv_left:
finish();
break;
case R.id.search_box:
//展示不显示
search_box = (LinearLayout) findViewById(R.id.search_box);
search_box.setVisibility(View.GONE);
// 显示搜索框
search_box_true = (LinearLayout) findViewById(R.id.search_box_true);
search_box_true.setVisibility(View.VISIBLE);
break;
//取消
case R.id.cancel:
search_box.setVisibility(View.VISIBLE);
search_box_true.setVisibility(View.GONE);
break;
}
}
class ViewHolder {
TextView letterListTextView;
public ViewHolder(View convertView) {
letterListTextView = (TextView) convertView.findViewById(R.id.letterListTextView);
}
}
}