package com.anthony.citypicker; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.anthony.citypicker.adapter.CityListAdapter; import com.anthony.citypicker.adapter.ResultListAdapter; import com.anthony.citypicker.db.DBManager; import com.anthony.citypicker.model.City; import com.anthony.citypicker.model.LocateState; import com.anthony.citypicker.utils.StringUtils; import com.anthony.citypicker.utils.ToastUtils; import com.anthony.citypicker.view.SideLetterBar; import java.util.List; public class CityPickerActivity extends AppCompatActivity implements View.OnClickListener { public static final int REQUEST_CODE_PICK_CITY = 2333; public static final String KEY_PICKED_CITY = "picked_city"; private ListView mListView; private ListView mResultListView; private SideLetterBar mLetterBar; private EditText searchBox; private ImageView clearBtn; private ImageView backBtn; private ViewGroup emptyView; private CityListAdapter mCityAdapter; private ResultListAdapter mResultAdapter; private List<City> mAllCities; private DBManager dbManager; private AMapLocationClient mLocationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_city_list); initData(); initView(); initLocation(); } private void initLocation() { mLocationClient = new AMapLocationClient(this); AMapLocationClientOption option = new AMapLocationClientOption(); option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); option.setOnceLocation(true); mLocationClient.setLocationOption(option); mLocationClient.setLocationListener(new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { String city = aMapLocation.getCity(); String district = aMapLocation.getDistrict(); Log.e("onLocationChanged", "city: " + city); Log.e("onLocationChanged", "district: " + district); String location = StringUtils.extractLocation(city, district); mCityAdapter.updateLocateState(LocateState.SUCCESS, location); } else { //定位失败 mCityAdapter.updateLocateState(LocateState.FAILED, null); } } } }); mLocationClient.startLocation(); } private void initData() { dbManager = new DBManager(this); // dbManager.copyRawFile(); dbManager.copyDBFile(); mAllCities = dbManager.getAllCities(); mCityAdapter = new CityListAdapter(this, mAllCities); mCityAdapter.setOnCityClickListener(new CityListAdapter.OnCityClickListener() { @Override public void onCityClick(String name) { back(name); } @Override public void onLocateClick() { Log.e("onLocateClick", "重新定位..."); mCityAdapter.updateLocateState(LocateState.LOCATING, null); mLocationClient.startLocation(); } }); mResultAdapter = new ResultListAdapter(this, null); } private void initView() { mListView = (ListView) findViewById(R.id.listview_all_city); mListView.setAdapter(mCityAdapter); TextView overlay = (TextView) findViewById(R.id.tv_letter_overlay); mLetterBar = (SideLetterBar) findViewById(R.id.side_letter_bar); mLetterBar.setOverlay(overlay); mLetterBar.setOnLetterChangedListener(new SideLetterBar.OnLetterChangedListener() { @Override public void onLetterChanged(String letter) { int position = mCityAdapter.getLetterPosition(letter); mListView.setSelection(position); } }); searchBox = (EditText) findViewById(R.id.et_search); searchBox.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) { } @Override public void afterTextChanged(Editable s) { String keyword = s.toString(); if (TextUtils.isEmpty(keyword)) { clearBtn.setVisibility(View.GONE); emptyView.setVisibility(View.GONE); mResultListView.setVisibility(View.GONE); } else { clearBtn.setVisibility(View.VISIBLE); mResultListView.setVisibility(View.VISIBLE); List<City> result = dbManager.searchCity(keyword); if (result == null || result.size() == 0) { emptyView.setVisibility(View.VISIBLE); } else { emptyView.setVisibility(View.GONE); mResultAdapter.changeData(result); } } } }); emptyView = (ViewGroup) findViewById(R.id.empty_view); mResultListView = (ListView) findViewById(R.id.listview_search_result); mResultListView.setAdapter(mResultAdapter); mResultListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { back(mResultAdapter.getItem(position).getName()); } }); clearBtn = (ImageView) findViewById(R.id.iv_search_clear); backBtn = (ImageView) findViewById(R.id.back); clearBtn.setOnClickListener(this); backBtn.setOnClickListener(this); } private void back(String city) { ToastUtils.showToast(this, "点击的城市:" + city); // Intent data = new Intent(); // data.putExtra(KEY_PICKED_CITY, city); // setResult(RESULT_OK, data); // finish(); } @Override public void onClick(View v) { if (v.getId() == R.id.iv_search_clear) { searchBox.setText(""); clearBtn.setVisibility(View.GONE); emptyView.setVisibility(View.GONE); mResultListView.setVisibility(View.GONE); } else if (v.getId() == R.id.back) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stopLocation(); } }