package com.wise.wawc; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.wise.data.CharacterParser; import com.wise.pubclas.Constant; import com.wise.pubclas.Variable; import com.wise.service.ClearEditText; import com.wise.service.SideBar; import com.wise.service.SideBar.OnTouchingLetterChangedListener; import com.wise.sql.DBHelper; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.LinearLayout.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * 选择城市 * @author honesty */ public class SelectCityActivity extends Activity { private static final String TAG = "SelectCityActivity"; ListView lv_activity_select_city; LinearLayout ll_activity_select_city; TextView tv_select_city_title, tv_activity_select_city_location; private TextView letterIndex = null; // 字母索引选中提示框 private SideBar sideBar = null; // 右侧字母索引栏 List<CityData> cityDatas = new ArrayList<CityData>(); List<CityData> filterCityDatas = new ArrayList<CityData>(); List<CityData> hotDatas; AllCityAdapter allCityAdapter; CharacterParser characterParser = new CharacterParser().getInstance(); // 将汉字转成拼音 private PinyinComparator comparator = new PinyinComparator();; // 根据拼音排序 String LocationCity = ""; String Citys; String Hot_Citys; boolean isWelcome = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_city); ImageView iv_select_city_back = (ImageView)findViewById(R.id.iv_select_city_back); iv_select_city_back.setOnClickListener(onClickListener); ll_activity_select_city = (LinearLayout) findViewById(R.id.ll_activity_select_city); tv_select_city_title = (TextView) findViewById(R.id.tv_select_city_title); tv_activity_select_city_location = (TextView) findViewById(R.id.tv_activity_select_city_location); tv_activity_select_city_location.setOnClickListener(onClickListener); LocationCity = Variable.City; tv_activity_select_city_location.setText(LocationCity); lv_activity_select_city = (ListView) findViewById(R.id.lv_activity_select_city); Intent intent = getIntent(); isWelcome = intent.getBooleanExtra("Welcome", false); GetCity(); cityDatas = GetCityList(Citys); hotDatas = GetCityList(Hot_Citys); //TODO 排序,添加热门 ProcessCitys(); filterCityDatas.addAll(cityDatas); allCityAdapter = new AllCityAdapter(filterCityDatas); lv_activity_select_city.setAdapter(allCityAdapter); lv_activity_select_city.setOnItemClickListener(lvOnItemClickListener); setupListView(); letterIndex = (TextView) findViewById(R.id.dialog); sideBar = (SideBar) findViewById(R.id.sidrbar); sideBar.setTextView(letterIndex); // 选中某个拼音索引 提示框显示 sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() { @Override public void onTouchingLetterChanged(String s) { for (int i = 0; i < cityDatas.size(); i++) { if (cityDatas.get(i).getFirst_letter().equals(s)) { lv_activity_select_city.setSelection(i); break; } } } }); registerBroadcastReceiver(); startService(new Intent(SelectCityActivity.this, LocationService.class)); ClearEditText mClearEditText = (ClearEditText) findViewById(R.id.filter_edit); mClearEditText.addTextChangedListener(textWatcher); } private void GetCity() { //查询 DBHelper dbHelper = new DBHelper(SelectCityActivity.this); SQLiteDatabase db = dbHelper.getReadableDatabase(); //城市 Cursor c = db.rawQuery("select * from " + Constant.TB_Base + " where Title=?", new String[] { "City" }); if (c.moveToFirst()) { Citys = c.getString(c.getColumnIndex("Content")); } c.close(); //热门城市 Cursor cursor = db.rawQuery("select * from " + Constant.TB_Base + " where Title=?", new String[] { "hotCity" }); if (cursor.moveToFirst()) { Hot_Citys = cursor.getString(cursor.getColumnIndex("Content")); } cursor.close(); db.close(); } TextWatcher textWatcher = 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 filterData(String filterStr){ //编辑框的内容为空的时候 if(TextUtils.isEmpty(filterStr)){ ll_activity_select_city.setVisibility(View.VISIBLE); tv_select_city_title.setText("热门城市"); filterCityDatas.clear(); filterCityDatas.addAll(cityDatas); }else{ filterCityDatas.clear(); ll_activity_select_city.setVisibility(View.GONE); for(CityData cityData : cityDatas){ String name = cityData.getCity(); if(name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())){ filterCityDatas.add(cityData); } } } allCityAdapter.notifyDataSetChanged(); } OnItemClickListener lvOnItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) { CityData cityData = filterCityDatas.get(arg2); if (cityData.getCity_code() != null) { Log.e(TAG, cityData.getCity_spell()); SaveCityInfo(cityData); } } }; OnItemClickListener gvOnItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { CityData HotCityData = hotDatas.get(arg2); Log.d(TAG, HotCityData.toString()); SaveCityInfo(HotCityData); } }; OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_activity_select_city_location: clickLocationCity(); break; case R.id.iv_select_city_back: finish(); break; } } }; private void clickLocationCity(){ if(!LocationCity.equals("")){ for(int i = 0 ; i < cityDatas.size() ; i++){ CityData cityData = cityDatas.get(i); if(cityData.Type == 1 && cityData.City_code != null){ if(cityData.getCity().equals(LocationCity.substring(0, (LocationCity.length() -1)))){ Log.d(TAG, cityData.toString()); SaveCityInfo(cityData); break; } } } } } /** * 存储城市信息 * @param cityData */ private void SaveCityInfo(CityData cityData){ SharedPreferences preferences = getSharedPreferences(Constant.sharedPreferencesName, Context.MODE_PRIVATE); Editor editor = preferences.edit(); editor.putString(Constant.LocationCity, cityData.getCity()); editor.putString(Constant.LocationCityCode, cityData.getCity_code()); editor.putString(Constant.LocationProvince, cityData.getProvince()); editor.putString(Constant.LocationCityFuel, cityData.getFuel_price()); editor.putString(Constant.FourShopParmeter, cityData.getCity_spell()); editor.commit(); Toast.makeText(SelectCityActivity.this, "您选择了城市:" +cityData.getCity(), Toast.LENGTH_LONG).show(); //TODO 释放内存 cityDatas.clear(); filterCityDatas.clear(); hotDatas.clear(); System.gc(); if(isWelcome){ startActivity(new Intent(SelectCityActivity.this, MainActivity.class)); }else{ setResult(1); } finish(); } private void setupListView() { lv_activity_select_city.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem != 0) { String letter = cityDatas.get(firstVisibleItem) .getFirst_letter(); String NextLetter = cityDatas.get(firstVisibleItem + 1) .getFirst_letter(); //Log.d(TAG, "Item = " + firstVisibleItem + "letter = " + letter + ",NextLetter = " + NextLetter); tv_select_city_title.setText(letter); if (!letter.equals(NextLetter)) { // 产生碰撞挤压效果 View childView = view.getChildAt(0); if (childView != null) { int titleHeight = ll_activity_select_city .getHeight(); int bottom = childView.getBottom(); MarginLayoutParams params = (MarginLayoutParams) ll_activity_select_city .getLayoutParams(); //Log.d(TAG, "bottom = " + bottom + ",titleHeight = " + titleHeight); if (bottom < titleHeight) { float pushedDistance = bottom - titleHeight; params.topMargin = (int) pushedDistance; ll_activity_select_city.setLayoutParams(params); } else { if (params.topMargin != 0) { params.topMargin = 0; ll_activity_select_city .setLayoutParams(params); } } } } else { //Log.d(TAG, "相等"); MarginLayoutParams params = (MarginLayoutParams) ll_activity_select_city .getLayoutParams(); params.topMargin = 0; ll_activity_select_city.setLayoutParams(params); } } else { } } }); } /** * 解析城市列表 * * @param Citys */ private List<CityData> GetCityList(String Citys) { List<CityData> Datas = new ArrayList<CityData>(); try { JSONArray jsonArray = new JSONArray(Citys); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); CityData cityData = new CityData(); if (jsonObject.opt("city_code") == null) { cityData.setCity_code(""); } else { cityData.setCity_code(jsonObject.getString("city_code")); } cityData.setType(1); cityData.setCity(jsonObject.getString("city")); cityData.setProvince(jsonObject.getString("province")); cityData.setCity_spell(jsonObject.getString("spell")); cityData.setFirst_letter(GetFristLetter(jsonObject.getString("city"))); if(jsonObject.opt("fuel_price") == null){ cityData.setFuel_price(""); }else{ cityData.setFuel_price(jsonObject.getString("fuel_price")); } Datas.add(cityData); } return Datas; } catch (JSONException e) { e.printStackTrace(); } return Datas; } /** * 给城市排序,添加热门城市 */ private void ProcessCitys() { Collections.sort(cityDatas, comparator); String Letter = ""; for (int i = 0; i < cityDatas.size(); i++) { if (!Letter.equals(cityDatas.get(i).getFirst_letter())) { // 增加标题 Letter = cityDatas.get(i).getFirst_letter(); CityData cityData = new CityData(); cityData.setType(1); cityData.setCity(Letter); cityData.setFirst_letter(Letter); cityDatas.add(i, cityData); } } CityData cityData = new CityData(); cityData.setType(0); cityData.setCity_code("10"); cityData.setCity("1231231231231"); cityData.setProvince("12312312312"); cityData.setFirst_letter("热门城市"); cityDatas.add(0, cityData); CityData cityData1 = new CityData(); cityData1.setType(1); cityData1.setCity("热门城市"); cityData1.setProvince("12312312312"); cityData1.setFirst_letter("热门城市"); cityDatas.add(0, cityData1); } private String GetFristLetter(String city) { String pinyin = characterParser.getSelling(city); String sortString = pinyin.substring(0, 1).toUpperCase(); // 正则表达式,判断首字母是否是英文字母 if (sortString.matches("[A-Z]")) { return sortString.toUpperCase(); } return "#"; } private class PinyinComparator implements Comparator<CityData> { @Override public int compare(CityData o1, CityData o2) { if (o1.getFirst_letter().equals("@") || o2.getFirst_letter().equals("#")) { return -1; } else if (o1.getFirst_letter().equals("#") || o2.getFirst_letter().equals("@")) { return 1; } else { return o1.getFirst_letter().compareTo(o2.getFirst_letter()); } } } private class AllCityAdapter extends BaseAdapter { private static final int VALUE_HOT = 0; private static final int VALUE_CITY = 1; List<CityData> citys; LayoutInflater mInflater; public AllCityAdapter(List<CityData> citys) { this.citys = citys; mInflater = LayoutInflater.from(SelectCityActivity.this); } @Override public int getCount() { return citys.size(); } @Override public Object getItem(int position) { return citys.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { CityData cityData = citys.get(position); int type = getItemViewType(position); ViewHot hotholder = null; ViewCity cityHolder = null; if (convertView == null) { switch (type) { case VALUE_HOT: hotholder = new ViewHot(); convertView = mInflater.inflate(R.layout.hot_city, null); hotholder.gv = (GridView) convertView.findViewById(R.id.gv_hot_city); int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 40, getResources() .getDisplayMetrics()); LayoutParams params = new LayoutParams( LayoutParams.FILL_PARENT, (hotDatas.size() / 4) * px); hotholder.gv.setLayoutParams(params); hotholder.gv.setAdapter(new hotAdapter()); hotholder.gv.setOnItemClickListener(gvOnItemClickListener); convertView.setTag(hotholder); break; case VALUE_CITY: cityHolder = new ViewCity(); convertView = mInflater.inflate(R.layout.item_select_city, null); cityHolder.tv_item_select_city = (TextView) convertView .findViewById(R.id.tv_item_select_city); cityHolder.tv_item_select_city_title = (TextView) convertView .findViewById(R.id.tv_item_select_city_title); if (citys.get(position).getCity_code() == null) { cityHolder.tv_item_select_city_title.setVisibility(View.VISIBLE); cityHolder.tv_item_select_city_title.setText(citys.get(position).getFirst_letter()); cityHolder.tv_item_select_city.setVisibility(View.GONE); } else { cityHolder.tv_item_select_city.setVisibility(View.VISIBLE); cityHolder.tv_item_select_city.setText(citys.get(position).getCity()); cityHolder.tv_item_select_city_title.setVisibility(View.GONE); } convertView.setTag(cityHolder); break; default: break; } } else { switch (type) { case VALUE_HOT: hotholder = (ViewHot) convertView.getTag(); break; case VALUE_CITY: cityHolder = (ViewCity) convertView.getTag(); if (citys.get(position).getCity_code() == null) { cityHolder.tv_item_select_city_title .setVisibility(View.VISIBLE); cityHolder.tv_item_select_city_title.setText(citys.get( position).getFirst_letter()); cityHolder.tv_item_select_city.setVisibility(View.GONE); } else { cityHolder.tv_item_select_city .setVisibility(View.VISIBLE); cityHolder.tv_item_select_city.setText(citys.get( position).getCity()); cityHolder.tv_item_select_city_title .setVisibility(View.GONE); } break; default: break; } } return convertView; } @Override public int getItemViewType(int position) { CityData cityData = citys.get(position); int type = cityData.getType(); return type; } @Override public int getViewTypeCount() { return 2; } private class ViewCity {// 城市列表 TextView tv_item_select_city, tv_item_select_city_title; } private class ViewHot {// 热门城市 GridView gv; } } private class CityData { int Type; String City_code; String city; String Province; String First_letter; String Fuel_price; String city_spell; public int getType() { return Type; } public void setType(int type) { Type = type; } public String getCity_code() { return City_code; } public void setCity_code(String city_code) { City_code = city_code; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getProvince() { return Province; } public void setProvince(String province) { Province = province; } public String getFirst_letter() { return First_letter; } public void setFirst_letter(String first_letter) { First_letter = first_letter; } public String getFuel_price() { return Fuel_price; } public void setFuel_price(String fuel_price) { Fuel_price = fuel_price; } public String getCity_spell() { return city_spell; } public void setCity_spell(String city_spell) { this.city_spell = city_spell; } @Override public String toString() { return "CityData [Type=" + Type + ", City_code=" + City_code + ", city=" + city + ", Province=" + Province + ", First_letter=" + First_letter + "]"; } } public class hotAdapter extends BaseAdapter { LayoutInflater mInflater = LayoutInflater.from(SelectCityActivity.this); @Override public int getCount() { return hotDatas.size(); } @Override public Object getItem(int position) { return hotDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.item_hot, null); holder = new ViewHolder(); holder.tv_item_hot = (TextView) convertView .findViewById(R.id.tv_item_hot); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv_item_hot.setText(hotDatas.get(position).getCity()); return convertView; } private class ViewHolder { TextView tv_item_hot; } } private void registerBroadcastReceiver() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Constant.A_City); registerReceiver(broadcastReceiver, intentFilter); } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Constant.A_City)) { LocationCity = intent.getStringExtra("City"); tv_activity_select_city_location.setText(LocationCity); } } }; @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(broadcastReceiver); } }