Android 城市选择增加热门城市

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);
		}
	}
}

 
源码下载 



  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值