Android 城市选择

今天在网上找了一个关于根据城市名字选择地区的列子

上图
这里写图片描述
这里写图片描述
这里写图片描述


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);  
        }  
    }  
//转自 http://blog.csdn.net/u014061684/article/details/50563360
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值