/**
*
*/
package com.keju.maomao.activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.TextView;
import com.keju.maomao.CommonApplication;
import com.keju.maomao.R;
import com.keju.maomao.activity.base.BaseActivity;
import com.keju.maomao.bean.SortModelBean;
import com.keju.maomao.db.DataBaseAdapter;
import com.keju.maomao.util.CharacterParser;
import com.keju.maomao.util.PinyinComparator;
import com.keju.maomao.util.SharedPrefUtil;
import com.keju.maomao.view.citychangeview.ClearEditText;
import com.keju.maomao.view.citychangeview.SideBar;
import com.keju.maomao.view.citychangeview.SideBar.OnTouchingLetterChangedListener;
/**
* 城市切换界面
*
* @author zhouyong
* @data 创建时间:2013-12-12 下午2:08:45
*/
public class CityChangActivity extends BaseActivity implements OnClickListener {
private ImageButton ibLeft;
private TextView tvTitle;
private ListView sortListView;
private SideBar sideBar;// 自定义字母排序控件
private TextView dialog; // 显示手触摸字母时放大显示控件
private SortAdapter adapter;
private ClearEditText mClearEditText; // 重写editText控件
private TextView tvPositioncity;
private int positionProvinceId;// 定位省的id
private CommonApplication app;
private DataBaseAdapter dba;
private Boolean isLocationCity;//是否定位到了当前城市 作为定位成丝的点击判断
/**
* 汉字转换成拼音的类
*/
private CharacterParser characterParser;
private List<SortModelBean> SourceDateList;
private List<SortModelBean> cityList = new ArrayList<SortModelBean>();// 城市list
/**
* 根据拼音来排列ListView里面的数据类
*/
private PinyinComparator pinyinComparator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.city_change_list);
dba = ((CommonApplication) this.getApplicationContext()).getDbAdapter();
app = (CommonApplication) getApplication();
findView();
fillData();
app.addActivity(this);
}
private void findView() {
app.initBMapInfo();
ibLeft = (ImageButton) this.findViewById(R.id.ibLeft);
tvTitle = (TextView) this.findViewById(R.id.tvTitle);
tvPositioncity = (TextView) this.findViewById(R.id.tvPositioncity);
if (app.getCity() == null) {
tvPositioncity.setText("无法地位到当前城市");
isLocationCity = false;
} else {
tvPositioncity.setText(app.getCity());
isLocationCity = true;
}
// 实例化汉字转拼音类
characterParser = CharacterParser.getInstance();
pinyinComparator = new PinyinComparator();
sortListView = (ListView) findViewById(R.id.countryList);
sortListView.setOnItemClickListener(itemListener);
mClearEditText = (ClearEditText) findViewById(R.id.edFilterSearch);
sideBar = (SideBar) findViewById(R.id.sidrbar);
dialog = (TextView) findViewById(R.id.dialog);
sideBar.setTextView(dialog);
// 设置右侧触摸监听
sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {
@Override
public void onTouchingLetterChanged(String s) {
// 该字母首次出现的位置
int position = adapter.getPositionForSection(s.charAt(0));
if (position != -1) {
sortListView.setSelection(position);
} else {
sortListView.setSelection(0);
}
}
});
// 根据输入框输入值的改变来过滤搜索
mClearEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表
filterData(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
private void fillData() {
ibLeft.setImageResource(R.drawable.ic_btn_left);
ibLeft.setOnClickListener(this);
tvTitle.setText("城市切换");
// 地位城市
tvPositioncity.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isLocationCity){
positionProvinceId = dba.findProvinceId(app.getCity()); // 根据城市名去数据库寻找对应的省id
SharedPrefUtil.setCityName(CityChangActivity.this, app.getCity());
SharedPrefUtil.setProvinceId(CityChangActivity.this, positionProvinceId);
Intent intent = new Intent();
intent.putExtra("PROVINCEID", positionProvinceId);
intent.putExtra("CITYNAME", app.getCity());
setResult(RESULT_OK, intent);
finish();
}
}
});
getCity();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibLeft:
finish();
break;
default:
break;
}
}
/**
* listview点击事件
*/
OnItemClickListener itemListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position >= cityList.size()) {
return;
}
// 这里要利用adapter.getItem(position)来获取当前position所对应的对象 否则筛选选择的不能对应
String cityName = ((SortModelBean) adapter.getItem(position)).getCityName();
int provinceId = ((SortModelBean) adapter.getItem(position)).getProvinceId();
Intent intent = new Intent();
intent.putExtra("PROVINCEID", provinceId);
intent.putExtra("CITYNAME", cityName);
SharedPrefUtil.setCityName(CityChangActivity.this, cityName);
SharedPrefUtil.setProvinceId(CityChangActivity.this, provinceId);
setResult(RESULT_OK, intent);
finish();
}
};
/**
* 从数据库获取城市
*/
private void getCity() {
cityList = dba.findAllCitys();
filledData(cityList);
SourceDateList = cityList;
// 根据a-z进行排序源数据
Collections.sort(SourceDateList, pinyinComparator);
adapter = new SortAdapter(SourceDateList);
sortListView.setAdapter(adapter);
}
/**
* 获取所有城市
*
*
* private class GetCityTask extends AsyncTask<Void, Void, JSONObject> {
*
* @Override protected void onPreExecute() { super.onPreExecute();
* showPd(R.string.loading); }
* @Override protected JSONObject doInBackground(Void... params) { try {
* return new BusinessHelper().getCity(); } catch (SystemException
* e) { e.printStackTrace(); } return null; }
* @Override protected void onPostExecute(JSONObject result) {
* super.onPostExecute(result); dismissPd(); if (result != null) {
* try { if (result.getInt("status") == Constants.REQUEST_SUCCESS)
* { JSONArray cityArr = result.getJSONArray("city"); if (cityArr
* != null) { ArrayList<SortModelBean> cityBean =
* (ArrayList<SortModelBean>) SortModelBean
* .constractList(cityArr); cityList.addAll(cityBean);
* filledData(cityBean); SourceDateList = cityList;
*
* // 根据a-z进行排序源数据 Collections.sort(SourceDateList,
* pinyinComparator); adapter = new SortAdapter(SourceDateList);
* sortListView.setAdapter(adapter); } } } catch (JSONException e)
* { e.printStackTrace(); showShortToast(R.string.json_exception);
* } } else { showShortToast(R.string.connect_server_exception); }
* }
*
* }
*/
/**
* 为ListView填充数据
*
* @param cityList2
* @return
*/
private List<SortModelBean> filledData(List<SortModelBean> cityList2) {
List<SortModelBean> mSortList = new ArrayList<SortModelBean>();
for (int i = 0; i < cityList2.size(); i++) {
SortModelBean sortModel = cityList2.get(i);
// sortModel.setName(cityBean.);
// 汉字转换成拼音
String pinyin = characterParser.getSelling(sortModel.getCityName());
String sortString = pinyin.substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortString.matches("[A-Z]")) {
sortModel.setSortLetters(sortString.toUpperCase());
} else {
sortModel.setSortLetters("热门");
}
mSortList.add(sortModel);
}
return mSortList;
}
/**
* 根据输入框中的值来过滤数据并更新ListView
*
* @param filterStr
*/
private void filterData(String filterStr) {
List<SortModelBean> filterDateList = new ArrayList<SortModelBean>();
if (TextUtils.isEmpty(filterStr)) {
filterDateList = SourceDateList;
} else {
filterDateList.clear();
for (SortModelBean sortModel : SourceDateList) {
String name = sortModel.getCityName();
if (name.indexOf(filterStr.toString()) != -1
|| characterParser.getSelling(name).startsWith(filterStr.toString())) {
filterDateList.add(sortModel);
}
}
}
// 根据a-z进行排序
Collections.sort(filterDateList, pinyinComparator);
adapter.updateListView(filterDateList);
}
/**
* 城市切换适配器
*
*/
private class SortAdapter extends BaseAdapter implements SectionIndexer {
private List<SortModelBean> list = null;
/**
* @param sourceDateList2
*/
public SortAdapter(List<SortModelBean> sourceDateList2) {
this.list = sourceDateList2;
}
/**
* 当ListView数据发生变化时,调用此方法来更新ListView
*
* @param list
*/
public void updateListView(List<SortModelBean> SourceDateList) {
this.list = SourceDateList;
notifyDataSetChanged();
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
SortModelBean mContent = list.get(position);
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = getLayoutInflater().inflate(R.layout.city_change_item, null);
viewHolder.tvCityName = (TextView) convertView.findViewById(R.id.tvCityName);
viewHolder.tvLetter = (TextView) convertView.findViewById(R.id.catalog);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 根据position获取分类的首字母的Char ascii值
int section = getSectionForPosition(position);
// 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
if (position == getPositionForSection(section)) {
viewHolder.tvLetter.setVisibility(View.VISIBLE);
viewHolder.tvLetter.setText(mContent.getSortLetters());
} else {
viewHolder.tvLetter.setVisibility(View.GONE);
}
viewHolder.tvCityName.setText(mContent.getCityName());
return convertView;
}
class ViewHolder {
TextView tvLetter;
TextView tvCityName;
}
@Override
public int getSectionForPosition(int position) {
return list.get(position).getSortLetters().charAt(0);
}
@Override
public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getSortLetters();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
/**
* 提取英文的首字母,非英文字母用#代替。
*
* @param str
* @return
*/
private String getAlpha(String str) {
String sortStr = str.trim().substring(0, 1).toUpperCase();
// 正则表达式,判断首字母是否是英文字母
if (sortStr.matches("[A-Z]")) {
return sortStr;
} else {
return "热门";
}
}
@Override
public Object[] getSections() {
return null;
}
}
}