package com.roboo.like.netease; import java.util.LinkedList; import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.FrameLayout.LayoutParams; import android.widget.AutoCompleteTextView; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.FrameLayout; 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.roboo.like.netease.adapter.SectionListAdapter; import com.roboo.like.netease.dao.ICityDao; import com.roboo.like.netease.dao.impl.CityDaoImpl; import com.roboo.like.netease.database.DBHelper; import com.roboo.like.netease.model.City; import com.roboo.like.netease.utils.PinYinUtils; import com.roboo.like.netease.view.SectionListView; @SuppressLint("DefaultLocale") public class CityList2Activity extends BaseActivity { private AutoCompleteTextView mACTVTextView; private LinkedList<City> mData; private LocationClient mLocationClient; private SectionListView mListView; private MyListAdapter mAdapter; private SectionListAdapter mSectionListAdapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTVTitle(R.string.tv_city_list2); // TODO setContentView Tag setContentView(R.layout.activity_city_list2); // TODO initView method Tag initView(); setData(); // this.mACTVTextView.setAdapter(new ArrayAdapter<String>(this, // android.R.layout.simple_dropdown_item_1line, getHandleData())); setAdapter(); this.mListView.setAdapter(mSectionListAdapter); // TODO setListener method Tag setListener(); // 模拟定位城市改变 // this.showCityNameBtn(true, cityArrays[new Random().nextInt(4)]); this.showMyProgressBar(true); initBaiduLocation(); } private void setAdapter() { mAdapter = new MyListAdapter(mData, CityList2Activity.this); mSectionListAdapter = new SectionListAdapter(getLayoutInflater(), mAdapter); } private void initBaiduLocation() { mLocationClient = new LocationClient(this); mLocationClient.registerLocationListener(new BDLocationListener() { public void onReceiveLocation(BDLocation location) { if (location == null) { return; } StringBuffer sb = new StringBuffer(256); sb.append("time : "); sb.append(location.getTime()); sb.append("\nerror code : "); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) { sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\naddr : "); sb.append(location.getAddrStr()); } sb.append("\ncity = "); String cityName = location.getCity(); sb.append(cityName); sb.append("\ncityCode = "); sb.append(location.getCityCode()); System.out.println(" onReceiveLocation sb.toString = " + sb.toString()); if (null != cityName) { if ("市".equals(cityName.substring(cityName.length() - 1, cityName.length()))) { cityName = cityName.substring(0, cityName.length() - 1); } Toast.makeText(getBaseContext(), "定位成功", Toast.LENGTH_SHORT).show(); CityList2Activity.this.showMyProgressBar(false); CityList2Activity.this.showCityNameBtn(true, cityName); } } public void onReceivePoi(BDLocation poiLocation) { if (poiLocation == null) { return; } StringBuffer sb = new StringBuffer(256); sb.append("Poi time : "); sb.append(poiLocation.getTime()); sb.append("\nerror code : "); sb.append(poiLocation.getLocType()); sb.append("\nlatitude : "); sb.append(poiLocation.getLatitude()); sb.append("\nlontitude : "); sb.append(poiLocation.getLongitude()); sb.append("\nradius : "); sb.append(poiLocation.getRadius()); if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\naddr : "); sb.append(poiLocation.getAddrStr()); } if (poiLocation.hasPoi()) { sb.append("\nPoi:"); sb.append(poiLocation.getPoi()); } else { sb.append("noPoi information"); } System.out.println(" onReceivePoi sb.toString = " + sb.toString()); } }); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setAddrType("all"); option.setCoorType("bd09ll"); option.setScanSpan(900); option.setPoiNumber(6); mLocationClient.setLocOption(option); mLocationClient.start(); mLocationClient.requestLocation(); } @Override protected void onPause() { mLocationClient.stop(); super.onPause(); } @Override protected void onResume() { // TODO super.onResume(); mLocationClient.start(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_always_selected_city: ICityDao cityDao = new CityDaoImpl(new DBHelper(this)); cityDao.setSelectedCity(cityDao.getCityCodeByCityName(((TextView) v).getText() + "")); setResult(RESULT_OK); this.finish(); break; default: super.onClick(v); break; } } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); } private LinkedList<String> getHandleData() { ICityDao cityDao = new CityDaoImpl(new DBHelper(this)); LinkedList<City> data = cityDao.getCityList(); LinkedList<String> result = new LinkedList<String>(); for (City city : data) { result.add(city.getCityName()); } return result; } private void setData() { ICityDao cityDao = new CityDaoImpl(new DBHelper(this)); this.mData = cityDao.getCityList(); } private void initView() { this.mACTVTextView = (AutoCompleteTextView) findViewById(R.id.actv_textview); this.mListView = (SectionListView) findViewById(R.id.lv_list); } private class MyListAdapter extends BaseAdapter implements Filterable { private LinkedList<City> data; private Context context; public MyListAdapter(LinkedList<City> data, Context context) { this.data = data; this.context = context; } @Override public int getCount() { return null == data ? 0 : data.size(); } @Override public Object getItem(int position) { return null == data ? null : data.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(context).inflate(R.layout.city_list_item, null); ViewHolder holder = new ViewHolder(); holder.mTVCityName = (TextView) convertView.findViewById(R.id.tv_city_name); holder.mLinearLayout = (LinearLayout) convertView.findViewById(R.id.linear_sort_key_container); if (null != data) { holder.mTVCityName.setText(data.get(position).getCityName()); } if (null == holder.mTVSortKey) { holder.mLinearLayout.setVisibility(View.GONE); } return convertView; } private class ViewHolder { public TextView mTVCityName; public LinearLayout mLinearLayout; public TextView mTVSortKey; } @Override public Filter getFilter() { return new MyFilter(); } } private void setListener() { this.mACTVTextView.setOnItemClickListener(new OnItemClickListenerImpl(this.mACTVTextView)); this.mACTVTextView.addTextChangedListener(filterTextWatcher); } private class OnItemClickListenerImpl implements OnItemClickListener { private View mView; private ICityDao mCityDao; public OnItemClickListenerImpl(View mView) { super(); this.mView = mView; this.mCityDao = new CityDaoImpl(new DBHelper(CityList2Activity.this)); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (this.mView instanceof ListView) { City city = (City) parent.getItemAtPosition(position); this.mCityDao.setSelectedCity(city.getCityCode()); } else if (this.mView instanceof AutoCompleteTextView) { String cityName = (String) parent.getItemAtPosition(position); this.mCityDao.setSelectedCity(this.mCityDao.getCityCodeByCityName(cityName)); } setResult(RESULT_OK); finish(); } } public class MyFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { // constraint = mACTVTextView.getText().toString(); FilterResults result = new FilterResults(); if (!TextUtils.isEmpty(constraint)) { LinkedList<City> filt = new LinkedList<City>(); LinkedList<City> Items = new LinkedList<City>(); synchronized (this) { Items = mData; } for (int i = 0; i < Items.size(); i++) { City item = Items.get(i); handleFilter(constraint, filt, item); } result.count = filt.size(); result.values = filt; } else { synchronized (this) { result.count = mData.size(); result.values = mData; } } return result; } private void handleFilter(CharSequence constraint, LinkedList<City> filt, City item) { // for(int i = 0; i < constraint.length();i++) // { // CharSequence subStr = constraint.subSequence(i, // constraint.length()); // String pinyin = // PinYinUtils.converterToSpell(item.getCityName().substring(i)); // if // (pinyin.toLowerCase().startsWith(subStr.toString().toLowerCase())||item.getCityName().toLowerCase().startsWith(subStr.toString().toLowerCase())) // { // filt.add(item); // } // } if (item.getCityPinYinName().toLowerCase().startsWith(constraint.toString().toLowerCase()) || item.getCityName().toLowerCase().startsWith(constraint.toString().toLowerCase())) { filt.add(item); } }; @Override protected void publishResults(CharSequence constraint, FilterResults results) { @SuppressWarnings("unchecked") LinkedList<City> filtered = (LinkedList<City>) results.values; if(null == imageView) { imageView = new ImageView(CityList2Activity.this); } imageView.setVisibility(View.GONE); mAdapter = new MyListAdapter(filtered, CityList2Activity.this); mSectionListAdapter = new SectionListAdapter(getLayoutInflater(), mAdapter); mListView.setAdapter(mSectionListAdapter); if (filtered.size() == 0) { Toast.makeText(getBaseContext(), "你要查找的城市在火星吗", Toast.LENGTH_SHORT).show(); imageView.setVisibility(View.VISIBLE); imageView.setImageResource(R.drawable.ic_matrix); imageView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER)); if(imageView.getParent() == null) { ((FrameLayout)mListView.getParent()).addView(imageView); } else { imageView.setVisibility(View.VISIBLE); } } } } ImageView imageView = null; private TextWatcher filterTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { new MyListAdapter(mData, CityList2Activity.this).getFilter().filter(s.toString()); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } }; }