Android 城市选择增加热门城市
2016-01-22 17:35
429 查看
Android 城市选择 可用于第一次进入应用程序定位失败后手动选择城市。
实现代码
源码下载
实现代码
<pre name="code" class="java">package com.jock.cityselecter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.IBinder; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.jock.cityselecter.adapter.MyBaseAdapter; import com.jock.cityselecter.adapter.SortAdapter; import com.jock.cityselecter.bean.RegionInfo; import com.jock.cityselecter.bean.SortModel; import com.jock.cityselecter.db.RegionDAO; import com.jock.cityselecter.utils.CharacterParser; import com.jock.cityselecter.utils.ClearEditText; import com.jock.cityselecter.utils.PinyinComparator; import com.jock.cityselecter.widget.SideBar; public class CitySelecterActivity extends Activity { private List<RegionInfo> provinceList; private List<RegionInfo> citysList; private List<String> provinces; private ListView sortListView; private SideBar sideBar; private TextView dialog; private SortAdapter adapter; private ClearEditText mClearEditText; private List<RegionInfo> mReMenCitys;// 热门城市列表 private MyGridViewAdapter gvAdapter; private GridView mGridView; private RelativeLayout iv_left; /** * 汉字转换成拼音的类 */ private CharacterParser characterParser; private List<SortModel> SourceDateList; /** * 根据拼音来排列ListView里面的数据类 */ private PinyinComparator pinyinComparator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_city_selecter); initData(); initViews(); } private void initData() { provinceList = RegionDAO.getProvencesOrCity(1); provinceList.addAll(RegionDAO.getProvencesOrCity(2)); citysList = new ArrayList<RegionInfo>(); mReMenCitys = new ArrayList<RegionInfo>(); provinces = new ArrayList<String>(); for (RegionInfo info : provinceList) { provinces.add(info.getName().trim()); } mReMenCitys.add(new RegionInfo(180, 13, "武汉")); mReMenCitys.add(new RegionInfo(194, 13, "孝感")); mReMenCitys.add(new RegionInfo(32, 1, "重庆")); mReMenCitys.add(new RegionInfo(2, 1, "北京")); mReMenCitys.add(new RegionInfo(25, 1, "上海")); mReMenCitys.add(new RegionInfo(77, 6, "深圳")); mReMenCitys.add(new RegionInfo(76, 6, "广州")); mReMenCitys.add(new RegionInfo(197, 14, "长沙")); mReMenCitys.add(new RegionInfo(343, 1, "天津")); } private void initViews() { iv_left = (RelativeLayout) findViewById(R.id.iv_left); View view = View.inflate(this, R.layout.head_city_list, null); mGridView = (GridView) view.findViewById(R.id.id_gv_remen); gvAdapter = new MyGridViewAdapter(this, mReMenCitys); mGridView.setAdapter(gvAdapter); mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); // 实例化汉字转拼音类 characterParser = CharacterParser.getInstance(); pinyinComparator = new PinyinComparator(); sideBar = (SideBar) findViewById(R.id.sidrbar); dialog = (TextView) findViewById(R.id.dialog); sideBar.setTextView(dialog); // 设置右侧触摸监听 sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() { @Override public void onTouchingLetterChanged(String s) { // 该字母首次出现的位置 int position = adapter.getPositionForSection(s.charAt(0)); if (position != -1) { sortListView.setSelection(position); } } }); sortListView = (ListView) findViewById(R.id.country_lvcountry); sortListView.addHeaderView(view); sortListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 这里要利用adapter.getItem(position)来获取当前position所对应的对象 Toast.makeText(getApplication(), ((SortModel) adapter.getItem(position - 1)).getName(), Toast.LENGTH_SHORT).show(); hideSoftInput(mClearEditText.getWindowToken()); Intent data = new Intent(); data.putExtra("cityName", ((SortModel) adapter.getItem(position - 1)).getName()); setResult(1110, data); } }); // SourceDateList = // filledData(getResources().getStringArray(R.array.date)); SourceDateList = filledData(provinceList); // 根据a-z进行排序源数据 Collections.sort(SourceDateList, pinyinComparator); adapter = new SortAdapter(this, SourceDateList); sortListView.setAdapter(adapter); mClearEditText = (ClearEditText) findViewById(R.id.filter_edit); // 根据输入框输入值的改变来过滤搜索 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) { } }); iv_left.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { hideSoftInput(mClearEditText.getWindowToken()); CitySelecterActivity.this.finish(); } }); mGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String cityName = mReMenCitys.get(position).getName(); Toast.makeText(getApplication(), cityName, Toast.LENGTH_SHORT).show(); hideSoftInput(mClearEditText.getWindowToken()); Intent data = new Intent(); data.putExtra("cityName", cityName); setResult(1110, data); } }); } /** * 为ListView填充数据 * * @param date * @return */ private List<SortModel> filledData(List<RegionInfo> date) { List<SortModel> mSortList = new ArrayList<SortModel>(); for (int i = 0; i < date.size(); i++) { SortModel sortModel = new SortModel(); sortModel.setName(date.get(i).getName()); // 汉字转换成拼音 String pinyin = characterParser.getSelling(date.get(i).getName()); 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<SortModel> filterDateList = new ArrayList<SortModel>(); if (TextUtils.isEmpty(filterStr)) { filterDateList = SourceDateList; } else { if (!provinces.contains(filterStr)) { filterDateList.clear(); for (SortModel sortModel : SourceDateList) { String name = sortModel.getName(); if (name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())) { filterDateList.add(sortModel); } } } else { filterDateList.clear(); for (int i = 0; i < provinceList.size(); i++) { String name = provinceList.get(i).getName(); if (name.equals(filterStr)) { filterDateList.addAll(filledData(RegionDAO.getProvencesOrCityOnParent(provinceList.get(i).getId()))); } } } } // 根据a-z进行排序 Collections.sort(filterDateList, pinyinComparator); adapter.updateListView(filterDateList); } private class MyGridViewAdapter extends MyBaseAdapter<RegionInfo, GridView> { private LayoutInflater inflater; public MyGridViewAdapter(Context ct, List<RegionInfo> list) { super(ct, list); inflater = LayoutInflater.from(ct); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.item_remen_city, null); holder.id_tv_cityname = (TextView) convertView.findViewById(R.id.id_tv_cityname); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } RegionInfo info = mReMenCitys.get(position); holder.id_tv_cityname.setText(info.getName()); return convertView; } class ViewHolder { TextView id_tv_cityname; } } @Override protected void onResume() { super.onResume(); } / * 多种隐藏软件盘方法的其中一种 * * @param token */ protected void hideSoftInput(IBinder token) { if (token != null) { InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } } }
源码下载
相关文章推荐
- android studio设置versioncode和versionname
- Android5.1--APK包的安装、卸载和优化(PackageManagerService)
- 读书笔记:android设计与实现第一…
- Android&nbsp;Studio&nbsp;中JNI开发流程小结
- 读书笔记:android设计与实现第二…
- Aidl开发流程(android&nbsp;studio)
- 读书笔记:android设计与实现第三…
- Android&nbsp;parcelable序列化
- 读书笔记:android设计与实现第四…
- android设计与实现&nbsp;收获
- Android&nbsp;优化布局:
- Android&nbsp;视图绘制流程:
- Android开发和Android Studio使用教程
- (安全系列一)Android Apk反编译得到Java源代码
- oschina的android源码分析学习-MainActivity
- [置顶] Android 友盟更新、推送、分享
- android源码
- Android apk文件方法数统计
- [Android4.4]NetworkManagementService与Netd交互流程
- 01Android_Studio过滤文件提交至Git