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