package com.partynetwork.iparty.iparty; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.CharArrayBuffer; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AlphabetIndexer; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.SectionIndexer; import android.widget.TextView; import com.partynetwork.dataprovider.util.CityUtil; import com.partynetwork.dataprovider.util.PinyinUtil; import com.partynetwork.iparty.R; import com.partynetwork.iparty.app.util.StringUtils; import com.partynetwork.iparty.app.widget.crouton.Crouton; import com.partynetwork.iparty.app.widget.crouton.Style; import com.partynetwork.myview.mysidebar.MySideBar; import com.partynetwork.myview.mysidebar.MySideBar.OnTouchingLetterChangedListener; import com.partynetwork.myview.mytoast.LoadingDialog; public class HotCityActivity extends Activity implements OnClickListener, OnTouchingLetterChangedListener, Callback { public static int RESULTCODE = 121; public static String MY_CITY = "myCity"; private LinearLayout headLeft; private ImageView headLeftImg; private TextView headTitle; private LinearLayout headRight; private ListView listView; private HotCityAdapter adapter; private MySideBar mySideBar; private LinearLayout titleLayout; private TextView title; private EditText searchEt; private TextView myCityTv; private String myCity; private List<String> cityList; private List<String> allCitys; private SectionIndexer mIndexer; private String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private Handler mHandler; private String[] hotCityStr = new String[] { "北京", "上海", "广州", "深圳", "成都", "重庆", "杭州" }; /** * 上次第一个可见元素,用于滚动时记录标识。 */ private int lastFirstVisibleItem = -1; // 小菊花 private LoadingDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hot_city); myCity = getIntent().getStringExtra(MY_CITY); initView(); // initHeadView(); initData(); } private void initHeadView() { LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); for (int i = 0; i < hotCityStr.length; i++) { HolderView holderView = new HolderView(this); if (i == 0) { holderView.titleLayout.setVisibility(View.VISIBLE); holderView.title.setText("热门城市"); } else { holderView.titleLayout.setVisibility(View.GONE); } holderView.setData(hotCityStr[i]); linearLayout.addView(holderView); } listView.addHeaderView(linearLayout); } private void initData() { mHandler = new Handler(this); mySideBar.setOnTouchingLetterChangedListener(this); dialog = new LoadingDialog(this); if (!StringUtils.isEmpty(myCity)) { myCityTv.setText(myCity); } dialog.show(); new Thread() { public void run() { allCitys = CityUtil.getAllCityName(); String[] strs = new String[allCitys.size()]; allCitys.toArray(strs); Arrays.sort(strs, new StringComparator()); allCitys = Arrays.asList(strs); List<String> list = new ArrayList<String>(); list.addAll(Arrays.asList(hotCityStr)); list.addAll(allCitys); allCitys = list; cityList = allCitys; mHandler.sendEmptyMessage(0); } }.start(); } private void initListView() { adapter = new HotCityAdapter(this, cityList); listView.setAdapter(adapter); if (cityList.size() > 0) { mIndexer = new AlphabetIndexer(new HotCityCursor(), 0, alphabet); setupListView(); } } private void setupListView() { listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO 自动生成的方法存根 } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int section = mIndexer.getSectionForPosition(firstVisibleItem); int nextSecPosition = mIndexer .getPositionForSection(section + 1); if (firstVisibleItem != lastFirstVisibleItem) { MarginLayoutParams params = (MarginLayoutParams) titleLayout .getLayoutParams(); params.topMargin = 0; titleLayout.setLayoutParams(params); if (firstVisibleItem < hotCityStr.length) { title.setText("热门城市"); } else { title.setText(String.valueOf(alphabet.charAt(section))); } } if (firstVisibleItem + 1 == hotCityStr.length || nextSecPosition == firstVisibleItem + 1) { View childView = view.getChildAt(0); if (childView != null) { int titleHeight = titleLayout.getHeight(); int bottom = childView.getBottom(); MarginLayoutParams params = (MarginLayoutParams) titleLayout .getLayoutParams(); if (bottom < titleHeight) { float pushedDistance = bottom - titleHeight; params.topMargin = (int) pushedDistance; titleLayout.setLayoutParams(params); } else { if (params.topMargin != 0) { params.topMargin = 0; titleLayout.setLayoutParams(params); } } } } lastFirstVisibleItem = firstVisibleItem; } }); } private void initView() { headLeft = (LinearLayout) findViewById(R.id.menu_head_left); headLeft.setOnClickListener(this); headLeftImg = (ImageView) findViewById(R.id.menu_head_left_iv); headLeftImg.setImageResource(R.drawable.menu_head_close); headTitle = (TextView) findViewById(R.id.menu_head_middle_text); headTitle.setTextColor(Color.BLACK); headTitle.setText("城市列表"); headRight = (LinearLayout) findViewById(R.id.menu_head_right); headRight.setVisibility(View.INVISIBLE); titleLayout = (LinearLayout) findViewById(R.id.title_layout); title = (TextView) findViewById(R.id.title); listView = (ListView) findViewById(R.id.listview); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String name = cityList.get(position); String cityId = CityUtil.getNum4Name(name); Intent data = new Intent(); data.putExtra("cityId", cityId); data.putExtra("cityName", name); HotCityActivity.this.setResult(RESULTCODE, data); HotCityActivity.this.finish(); } }); mySideBar = (MySideBar) findViewById(R.id.mysidebar); searchEt = (EditText) findViewById(R.id.search_et); searchEt.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) { // TODO 自动生成的方法存根 } @Override public void afterTextChanged(Editable s) { // TODO 自动生成的方法存根 } }); myCityTv = (TextView) findViewById(R.id.my_city_tv); } /** * 根据输入框中的值来过滤数据并更新ListView * * @param filterStr */ private void filterData(String filterStr) { if (TextUtils.isEmpty(filterStr)) { cityList = allCitys; } else { cityList = new ArrayList<String>(); for (String str : allCitys) { if (str.indexOf(filterStr.toString()) != -1 || PinyinUtil.getPingYin(str).startsWith( filterStr.toString())) { cityList.add(str); } } } String[] strs = new String[cityList.size()]; cityList.toArray(strs); Arrays.sort(strs, new StringComparator()); cityList = Arrays.asList(strs); initListView(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.menu_head_left: finish(); break; default: break; } } @Override public void onTouchingLetterChanged(String s) { if (alphaIndexer(s) > 0) { int position = alphaIndexer(s); listView.setSelection(position); } } private int alphaIndexer(String s) { int position = 0; if (cityList == null) { return 0; } for (int i = 0; i < cityList.size(); i++) { if (PinyinUtil.getSortKey(cityList.get(i)).startsWith(s)) { position = i; break; } } return position; } @Override public boolean handleMessage(Message msg) { switch (msg.what) { case 0: initListView(); break; default: break; } dialog.hide(); return false; } public class StringComparator implements Comparator<String> { public int compare(String arg0, String arg1) { String str1 = PinyinUtil.getSortKey(arg0); String str2 = PinyinUtil.getSortKey(arg1); return str1.compareTo(str2); } } /** * 适配器 * */ public class HotCityAdapter extends ArrayAdapter<String> { public HotCityAdapter(Context context, List<String> objects) { super(context, 0, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new HolderView(getContext()); } HolderView holderView = (HolderView) convertView; holderView.setData(getItem(position)); int section = mIndexer.getSectionForPosition(position); if (position == 0 || position == hotCityStr.length || position == mIndexer.getPositionForSection(section)) { holderView.title.setText(PinyinUtil .getSortKey(getItem(position))); holderView.titleLayout.setVisibility(View.VISIBLE); } else { holderView.titleLayout.setVisibility(View.GONE); } return holderView; } } /** * item */ private class HolderView extends LinearLayout { public LinearLayout titleLayout; public TextView title; public TextView cityName; public HolderView(Context context) { super(context); View.inflate(context, R.layout.hot_city_item, this); titleLayout = (LinearLayout) findViewById(R.id.title_ll); title = (TextView) findViewById(R.id.title_tv); cityName = (TextView) findViewById(R.id.city_name); } public void setData(String name) { cityName.setText(name); } } private class HotCityCursor implements Cursor { private int position; @Override public int getCount() { return cityList.size(); } @Override public int getPosition() { return 0; } @Override public boolean move(int offset) { // TODO 自动生成的方法存根 return false; } @Override public boolean moveToPosition(int position) { if (position < -1 || position > getCount()) { return false; } this.position = position; return true; } @Override public boolean moveToFirst() { // TODO 自动生成的方法存根 return false; } @Override public boolean moveToLast() { // TODO 自动生成的方法存根 return false; } @Override public boolean moveToNext() { // TODO 自动生成的方法存根 return false; } @Override public boolean moveToPrevious() { // TODO 自动生成的方法存根 return false; } @Override public boolean isFirst() { // TODO 自动生成的方法存根 return false; } @Override public boolean isLast() { // TODO 自动生成的方法存根 return false; } @Override public boolean isBeforeFirst() { // TODO 自动生成的方法存根 return false; } @Override public boolean isAfterLast() { // TODO 自动生成的方法存根 return false; } @Override public int getColumnIndex(String columnName) { // TODO 自动生成的方法存根 return 0; } @Override public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException { // TODO 自动生成的方法存根 return 0; } @Override public String getColumnName(int columnIndex) { // TODO 自动生成的方法存根 return null; } @Override public String[] getColumnNames() { // TODO 自动生成的方法存根 return null; } @Override public int getColumnCount() { // TODO 自动生成的方法存根 return 0; } @Override public byte[] getBlob(int columnIndex) { // TODO 自动生成的方法存根 return null; } @Override public String getString(int columnIndex) { if (cityList.size() < 1) { return ""; } return PinyinUtil.getAlpha(cityList.get(position)); } @Override public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) { // TODO 自动生成的方法存根 } @Override public short getShort(int columnIndex) { // TODO 自动生成的方法存根 return 0; } @Override public int getInt(int columnIndex) { // TODO 自动生成的方法存根 return 0; } @Override public long getLong(int columnIndex) { // TODO 自动生成的方法存根 return 0; } @Override public float getFloat(int columnIndex) { // TODO 自动生成的方法存根 return 0; } @Override public double getDouble(int columnIndex) { // TODO 自动生成的方法存根 return 0; } @Override public boolean isNull(int columnIndex) { // TODO 自动生成的方法存根 return false; } @Override public void deactivate() { // TODO 自动生成的方法存根 } @Override public boolean requery() { // TODO 自动生成的方法存根 return false; } @Override public void close() { // TODO 自动生成的方法存根 } @Override public boolean isClosed() { // TODO 自动生成的方法存根 return false; } @Override public void registerContentObserver(ContentObserver observer) { // TODO 自动生成的方法存根 } @Override public void unregisterContentObserver(ContentObserver observer) { // TODO 自动生成的方法存根 } @Override public void registerDataSetObserver(DataSetObserver observer) { // TODO 自动生成的方法存根 } @Override public void unregisterDataSetObserver(DataSetObserver observer) { // TODO 自动生成的方法存根 } @Override public void setNotificationUri(ContentResolver cr, Uri uri) { // TODO 自动生成的方法存根 } @Override public boolean getWantsAllOnMoveCalls() { // TODO 自动生成的方法存根 return false; } @Override public Bundle getExtras() { // TODO 自动生成的方法存根 return null; } @Override public Bundle respond(Bundle extras) { // TODO 自动生成的方法存根 return null; } } }