package com.itbox.grzl.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; import com.baidu.location.BDLocation; import com.itbox.fx.core.Application; import com.itbox.fx.core.AppException; import com.itbox.fx.location.LocManager; import com.itbox.fx.location.LocReceiver; import com.itbox.fx.widget.LoadingDialog; import com.zhaoliewang.grzl.R; import com.itbox.grzl.bean.AreaData; import com.itbox.grzl.common.db.AreaListDB; import com.itbox.grzl.widget.LetterListView; import com.itbox.grzl.widget.LetterListView.OnTouchingLetterChangedListener; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Bundle; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class SelectCityActivity extends BaseActivity implements OnClickListener, OnItemClickListener { public static class Extra{ public static final String SelectedItem = "selected_item"; } private BaseAdapter adapter; private ListView mListView; private TextView overlay; private LetterListView letterListView; /** 存放存在的汉语拼音首字母和与之对应的列表位置 */ private HashMap<String, Integer> alphaIndexer; /** 存放存在的汉语拼音首字母 */ private String[] sections; private Handler handler; private OverlayThread overlayThread; private ArrayList<AreaData> cityList; private TextView tvLocCity; private TextView tvRegCity; private AreaData areaReg; private AreaData areaLoc; private AreaListDB db; private LoadingDialog dialog; private TextView tvRegTitle; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_citylist); intiView(); } private void intiView() { mListView = (ListView) findViewById(R.id.city_lv); letterListView = (LetterListView) findViewById(R.id.city_letter); letterListView.setOnTouchingLetterChangedListener(new LetterListViewListener()); handler = new Handler(); overlayThread = new OverlayThread(); initOverlay(); db = new AreaListDB(); showLoadProgressDialog(); new Thread(){ public void run() { cityList = db.getCityList(); handler.post(new Runnable() { @Override public void run() { adapter = new ListAdapter(SelectCityActivity.this, cityList); mListView.setAdapter(adapter); findViewById(R.id.city_letter).setVisibility(View.VISIBLE); dialog.dismiss(); } }); }; }.start(); View view = View.inflate(this, R.layout.header_citylist, null); tvLocCity = (TextView) view.findViewById(R.id.city_header_tv_loc); tvRegCity = (TextView) view.findViewById(R.id.city_header_tv_reg); tvRegTitle = (TextView) view.findViewById(R.id.city_header_tv_reg_title); tvLocCity.setClickable(false); // tvRegCity.setClickable(false); tvLocCity.setOnClickListener(this); tvRegCity.setOnClickListener(this); mListView.setSelector(android.R.color.transparent); mListView.addHeaderView(view,null,false); mListView.setOnItemClickListener(this); /* if(null != MyinfoManager.getUserInfo() && 0 != MyinfoManager.getUserInfo().getUserCity()){ areaReg = db.getAreaByCode(MyinfoManager.getUserInfo().getUserCity()); tvRegCity.setText(areaReg.getAreaName()); tvRegCity.setVisibility(View.VISIBLE); tvRegTitle.setVisibility(View.VISIBLE); }else{ tvRegCity.setVisibility(View.GONE); tvRegTitle.setVisibility(View.GONE); }*/ tvRegCity.setVisibility(View.GONE); tvRegTitle.setVisibility(View.GONE); BDLocation mLocation = LocManager.getLocation(); if(null != mLocation){ tvLocCity.setText(mLocation.getCity()); try { areaLoc = db.getAreaByName(mLocation.getCity()); } catch (Exception e) { AppException.handle(e); finish(); return; } if(null != areaLoc){ tvLocCity.setClickable(true); } }else{ LocReceiver receiver = new LocReceiver(LocReceiver.Success_And_Fail) { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(LOC_FAIL.equals(action)){ tvLocCity.setText("城市定位失败"); }else{ tvLocCity.setText(LocManager.getLocation().getCity()); areaLoc = db.getAreaByName(LocManager.getLocation().getCity()); if(null != areaLoc){ tvLocCity.setClickable(true); } } } }; receiver.register(); LocManager.getInstance().refresh(); } } private class ListAdapter extends BaseAdapter { private LayoutInflater inflater; private List<AreaData> list; public ListAdapter(Context context, List<AreaData> list) { this.inflater = LayoutInflater.from(context); this.list = list; alphaIndexer = new HashMap<String, Integer>(); alphaIndexer.put("#", 0); sections = new String[list.size()]; for (int i = 0; i < list.size(); i++) { // 当前汉语拼音首字母 String currentStr = getAlpha(list.get(i).getPinYin()); // 上一个汉语拼音首字母,如果不存在为“ ” String previewStr = (i - 1) >= 0 ? getAlpha(list.get(i - 1).getPinYin()) : " "; if (!previewStr.equals(currentStr)) { String name = getAlpha(list.get(i).getPinYin()); alphaIndexer.put(name, i); sections[i] = name; } } } public int getCount() { return list.size(); } public Object getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_citylist, null); holder = new ViewHolder(); // holder.line = convertView.findViewById(R.id.item_city_line); holder.alpha = (TextView) convertView.findViewById(R.id.item_city_tv_alpha); holder.name = (TextView) convertView.findViewById(R.id.item_city_tv_name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } AreaData item = list.get(position); holder.name.setText(item.getAreaName()); // String previewStr = (position - 1) >= 0 ? // getAlpha(list.get(position - 1).getPinYin()) : " "; // if (!previewStr.equals(currentStr)) { if (null != sections[position]) { // holder.line.setVisibility(View.GONE); holder.alpha.setVisibility(View.VISIBLE);// 设置为可见 String currentStr = getAlpha(list.get(position).getPinYin()); holder.alpha.setText(currentStr); } else { // holder.line.setVisibility(View.VISIBLE); holder.alpha.setVisibility(View.GONE); } return convertView; } private class ViewHolder { //public View line; public TextView alpha; public TextView name; } } /** 初始化汉语拼音首字母弹出提示框 */ private void initOverlay() { LayoutInflater inflater = LayoutInflater.from(this); overlay = (TextView) inflater.inflate(R.layout.overlay, null); // 默认设置为不可见 overlay.setVisibility(View.INVISIBLE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); windowManager.addView(overlay, params); } private class LetterListViewListener implements OnTouchingLetterChangedListener { public void onTouchingLetterChanged(final String s) { if (alphaIndexer.get(s) != null) { if ("#".equals(s)) { mListView.setSelection(0); } else { int position = alphaIndexer.get(s); mListView.setSelection(position + mListView.getHeaderViewsCount()); } // overlay.setText(sections[position]); overlay.setText(s); overlay.setVisibility(View.VISIBLE); handler.removeCallbacks(overlayThread); // 延迟一秒后执行,让overlay为不可见 handler.postDelayed(overlayThread, 1500); } } } /** 设置overlay不可见 */ private class OverlayThread implements Runnable { public void run() { overlay.setVisibility(View.GONE); } } /** 获得汉语拼音首字母 */ private String getAlpha(String str) { if (str == null) { return "#"; } if (str.trim().length() == 0) { return "#"; } char c = str.trim().substring(0, 1).charAt(0); // 正则表达式,判断首字母是否是英文字母 Pattern pattern = Pattern.compile("^[A-Za-z]+$"); if (pattern.matcher(c + "").matches()) { return (c + "").toUpperCase(Locale.ENGLISH); } else { return "#"; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.city_header_tv_loc: setResultIntent(areaLoc); finish(); break; case R.id.city_header_tv_reg: setResultIntent(areaReg); finish(); break; default: break; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { AreaData areaData = cityList.get(position - ((ListView)parent).getHeaderViewsCount()); setResultIntent(areaData); finish(); } private void setResultIntent(AreaData area){ if(null != area){ Intent intent = new Intent(); intent.putExtra(Extra.SelectedItem, area); setResult(RESULT_OK, intent); } } }