您的位置:首页 > 其它

多系统的安装方法

2013-06-12 01:00 120 查看






美团_cc城市选择界面主要功能:
按首字母进行排序;

按首字母或者英文全拼搜索城市;

自定义SideBar,SideBar调到指定位置,进行搜索定位;
实现代码:

package com.chencheng.meituan.view;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.android.volley.VolleyError;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.chencheng.meituan.util.MeituanConstants;
import com.chencheng.meituan.util.PreferenceUtils;
import com.chencheng.model.city.City;
import com.chencheng.model.city.CityInfo;
import com.github.volley.MyVolley;
import com.github.volley.VolleyListener;
import com.xinbo.utils.GsonUtils;
import com.xinbo.widget.GridView4ScrollView;
import com.xinbo.widget.LetterSideBar.OnLetterChangedListener;
import com.xinbo.widget.SideBar;
import com.xinbo.widget.SideBar.OnTouchingLetterChangedListener;
import com.yuchen.meituan.R;
import com.yuchen.meituan.R.anim;
import com.yuchen.meituan.R.id;
import com.yuchen.meituan.R.layout;
import com.yuchen.meituan.R.menu;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class CityActivity extends Activity implements
OnLetterChangedListener, OnClickListener, OnTouchingLetterChangedListener {

private List<City> mHotCityList = new ArrayList<City>();
private List<City> mAllCityList = new ArrayList<City>();
private List<City> mSearchCityList = new ArrayList<City>();
private ArrayList<String> mRecentCityList = new ArrayList<String>();
private ListView mListView;
private MyListAdapter mAdapter;
private TextView mOverLay;
private View mTopHead;
private View mBottomHead;
private MyHotCityAdapter mHotCityAdapter;
private View mSearchLay;
private ListView mSearchList;
private View mSearchEmpty;
private EditText mSearchEdit;
private MyRecentAdapter mRecentAdapter;
private View mRecentLay;
private TextView mTvTitle;
private TextView mTvLocation;
private MyLocationListener mMyLocationListener;
private LocationClient mLocationClient;
private View mLoactionAgain;
private ImageView mCityRefresh;
private Animation animation;

private TextWatcher MyEditListener = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
searchCity(s.toString());
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}

@Override
public void afterTextChanged(Editable s) {
}
};
private MySearchAdapter mSearchAdapter;
private View mDelContent;
private OnItemClickListener MyCityListListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if(!(mAllCityList.size() > 0)){
return;
}

int pos = position - mListView.getHeaderViewsCount();
City city = mAllCityList.get(pos);
addCity(mRecentCityList, city.getName());
saveCity();
String name = city.getName();
setResult(MeituanConstants.Code.RESULT_LOCAL,
new Intent().putExtra("cityName", name));
finish();
}
};

protected void addCity(ArrayList<String> recentCityList, String cityName) {
if (recentCityList.contains(cityName)) {
recentCityList.remove(cityName);
} else {
if (recentCityList.size() >= 4) {
recentCityList.remove(recentCityList.size() - 1);
}
}
recentCityList.add(0, cityName);
}

protected void saveCity() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < mRecentCityList.size(); i++) {
String city = mRecentCityList.get(i);
String str;
if (i >= mRecentCityList.size() - 1) {
str = city;
} else {
str = city + ",";
}
sb.append(str);
}
PreferenceUtils.saveCity(this, sb.toString());
}

private OnItemClickListener MySearchListListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {

}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_city);
getJson();
initUI();
getCitySP();
setSideBarListener();
// 开始定位
startLocation();
}

private void getCitySP() {
String readCity = PreferenceUtils.readCity(this);
String[] split = readCity.split(",");
mRecentCityList.clear();
for (int i = 0; i < split.length; i++) {
mRecentCityList.add(split[i]);
}
mRecentAdapter.notifyDataSetChanged();
}

private void startLocation() {
mLocationClient = new LocationClient(getApplication());
mMyLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mMyLocationListener);
LocationClientOption option = new LocationClientOption();
// 设置定位模式:高精度
option.setLocationMode(LocationMode.Hight_Accuracy);
// 返回的定位结果是百度经纬度,默认值gcj02
option.setCoorType("gcj02");
// 设置定位模式,setScanSpan < 1000 则为 app主动请求定位; setScanSpan>=1000,则为定时定位模式
option.setScanSpan(500);
option.setAddrType("all");
// 设置是否反地理编码
option.setIsNeedAddress(true);
mLocationClient.setLocOption(option);
mLocationClient.start();
}

public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// Receive Location
//String addrStr = location.getAddrStr();
String cityName = location.getCity();
if(cityName != null){
mTvLocation.setText(cityName);
mLoactionAgain.setVisibility(View.GONE);
mCityRefresh.clearAnimation();
}else{
mTvLocation.setText("定位失败");
mLoactionAgain.setVisibility(View.VISIBLE);
mCityRefresh.clearAnimation();
}

//if (mAllCityList != null) {
//for (int i = 0; i < mAllCityList.size(); i++) {
//City city = mAllCityList.get(i);
//if (addrStr.contains(city.getName())) {
//mTvLocation.setText(city.getName());
//mLoactionAgain.setVisibility(View.GONE);
//mCityRefresh.clearAnimation();
//return;
//} else {
//mTvLocation.setText("定位失败");
//mLoactionAgain.setVisibility(View.VISIBLE);
//}
//}
//} else {
//mTvLocation.setText("定位失败");
//mLoactionAgain.setVisibility(View.VISIBLE);
//}
}
}

@Override
protected void onDestroy() {
mLocationClient.stop();
super.onDestroy();
}

private void initUI() {
initHeadView();
initListView();

mCityRefresh = (ImageView) findViewById(R.id.img_city_refresh);
mTvTitle = (TextView) findViewById(R.id.tv_title_city);
mOverLay = (TextView) findViewById(R.id.tv_over_letter);
mOverLay.setVisibility(View.GONE);
mDelContent = findViewById(R.id.img_cancle_content);
mSearchEdit = (EditText) findViewById(R.id.edit_search);
mSearchLay = findViewById(R.id.layout_search);
mSearchList = (ListView) findViewById(R.id.list_search);
mSearchEmpty = findViewById(R.id.tv_search_empty);
mSearchAdapter = new MySearchAdapter();
mSearchList.setAdapter(mSearchAdapter);
mDelContent.setOnClickListener(this);
findViewById(R.id.back_btn).setOnClickListener(this);
findViewById(R.id.rl_refresh).setOnClickListener(this);
mSearchEdit.addTextChangedListener(MyEditListener);
mSearchList.setOnItemClickListener(MySearchListListener);
}

protected void searchCity(String input) {
if (input.equals("")) {
mSearchLay.setVisibility(View.GONE);
mDelContent.setVisibility(View.GONE);
return;
}
mSearchLay.setVisibility(View.VISIBLE);
mDelContent.setVisibility(View.VISIBLE);
mSearchCityList.clear();
for (int i = 0; i < mAllCityList.size(); i++) {
City city = mAllCityList.get(i);
if (city.getName().startsWith(input)
|| city.getPinyin().toLowerCase()
.startsWith(input.toLowerCase())) {
mSearchCityList.add(city);
}
}
mSearchAdapter.notifyDataSetChanged();
}

private void initHeadView() {
mTopHead = getLayoutInflater()
.inflate(R.layout.city_headview_top, null);
mBottomHead = getLayoutInflater().inflate(
R.layout.city_headview_bottom, null);
GridView4ScrollView mGridView = (GridView4ScrollView) mBottomHead
.findViewById(R.id.gv_hot_city);
mHotCityAdapter = new MyHotCityAdapter();
mGridView.setAdapter(mHotCityAdapter);
GridView4ScrollView mRecentGrid = (GridView4ScrollView) mTopHead
.findViewById(R.id.gv_recent_city);
mRecentAdapter = new MyRecentAdapter();
mRecentGrid.setAdapter(mRecentAdapter);

mRecentLay = mTopHead.findViewById(R.id.layout_recent_title);
mTvLocation = (TextView) mTopHead.findViewById(R.id.tv_location);
mLoactionAgain = mTopHead.findViewById(R.id.tv_location_again);
mLoactionAgain.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startLocation();
mTvLocation.setText("定位中...");
mLoactionAgain.setVisibility(View.GONE);
}
});
}

private void setSideBarListener() {
SideBar mSideBar = (SideBar) findViewById(R.id.myView);
mSideBar.setOnTouchingLetterChangedListener(this);
}

public int searchPosition(String s) {
for (int i = 0; i < mAllCityList.size(); i++) {
City city = mAllCityList.get(i);
String spell = city.getPinyin().toUpperCase();
if (spell.startsWith(s)) {
return i + 2;
}
if ("$".equals(s)) {
return 0;
}
if ("*".equals(s)) {
return 1;
}
}
return -1;
}

private void initListView() {
mListView = (ListView) findViewById(R.id.lv_show_city);
mListView.addHeaderView(mTopHead);
mListView.addHeaderView(mBottomHead);
mAdapter = new MyListAdapter();
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(MyCityListListener);
}

class MySearchAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
City city = mSearchCityList.get(position);
View layout = getLayoutInflater().inflate(R.layout.list_item_city,
null);
TextView tvCityName = (TextView) layout
.findViewById(R.id.tv_city_name);
TextView tvGroupTitle = (TextView) layout
.findViewById(R.id.tv_group_title);
tvCityName.setText(city.getName());
tvGroupTitle.setVisibility(View.GONE);
return layout;
}

@Override
public int getCount() {
return mSearchCityList.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.img_cancle_content:
// 清空搜索框
mSearchEdit.setText("");
mSearchLay.setVisibility(View.GONE);
mDelContent.setVisibility(View.GONE);
break;
case R.id.back_btn:
finish();
break;
case R.id.city_top_xiala:
case R.id.text_citylocate:

break;
case R.id.rl_refresh:
animation = AnimationUtils.loadAnimation(this,
R.anim.rotate_city_refresh);
mCityRefresh.startAnimation(animation);
startLocation();
mTvLocation.setText("定位中...");
mLoactionAgain.setVisibility(View.GONE);
break;

default:
break;
}
}

class MyRecentAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = getLayoutInflater().inflate(
R.layout.list_item_hotcity, null);
String cityName = mRecentCityList.get(position);
TextView tvCityName = (TextView) layout
.findViewById(R.id.tv_city_name);
View rightLine = layout.findViewById(R.id.tv_line_right);
if (position == (mRecentCityList.size() - 1)) {
rightLine.setVisibility(View.GONE);
}
tvCityName.setText(cityName);
return layout;
}

@Override
public int getCount() {
return mRecentCityList.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
}

class MyHotCityAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
City city = mHotCityList.get(position);
View layout = getLayoutInflater().inflate(
R.layout.list_item_hotcity, null);
TextView tvCityName = (TextView) layout
.findViewById(R.id.tv_city_name);
View rightLine = layout.findViewById(R.id.tv_line_right);
tvCityName.setText(city.getName());
if ((position + 1) % 4 == 0) {
rightLine.setVisibility(View.GONE);
}
return layout;
}

@Override
public int getCount() {
return mHotCityList.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
}

class MyListAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
City city = mAllCityList.get(position);
View layout = getLayoutInflater().inflate(R.layout.list_item_city,
null);
TextView tvCityName = (TextView) layout
.findViewById(R.id.tv_city_name);
TextView tvGroupTitle = (TextView) layout
.findViewById(R.id.tv_group_title);
tvCityName.setText(city.getName());
String currFirstSpell = city.getPinyin().substring(0, 1);
tvGroupTitle.setText(currFirstSpell.toUpperCase());
// 判断当前和上一个Item的第一个拼音是否相同
if (position > 0) {
City lastCity = mAllCityList.get(position - 1);
if (currFirstSpell.equals(lastCity.getPinyin().substring(0, 1))) {
tvGroupTitle.setVisibility(View.GONE);
} else {
tvGroupTitle.setVisibility(View.VISIBLE);
}
}
return layout;
}

@Override
public int getCount() {
return mAllCityList.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
}

private void getJson() {
MyVolley.get(this, MeituanConstants.UrlPath.CITIES, new VolleyListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
arg0.getMessage();
}

@Override
public void onResponse(String arg0) {
parseJson(arg0);
}
});
}

protected void parseJson(String arg0) {
CityInfo cityInfo = GsonUtils.parseJSON(arg0, CityInfo.class);
mHotCityList.addAll(cityInfo.getHotcity());
mAllCityList.addAll(cityInfo.getAllcity());
Collections.sort(mAllCityList, new Comparator<City>() {
@Override
public int compare(City lhs, City rhs) {
return lhs.getPinyin().compareTo(rhs.getPinyin());
}
});
mAdapter.notifyDataSetChanged();
mHotCityAdapter.notifyDataSetChanged();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.city, menu);
return false;
}

@Override
public void onLetterChanged(String letter) {
mOverLay.setText(letter);
mOverLay.setVisibility(View.VISIBLE);
// 改变ListView选中Position
int position = searchPosition(letter);
if (position >= 0) {
mListView.setSelection(position);
}
}

@Override
public void onActionUp() {
mOverLay.setVisibility(View.GONE);

}

@Override
public void onTouchingLetterChanged(String s) {
mOverLay.setText(s);
mOverLay.setVisibility(View.VISIBLE);
// 改变ListView选中Position
int position = searchPosition(s);
if (position >= 0) {
mListView.setSelection(position);
}
}

@Override
public void onTouchCancle() {
mOverLay.setVisibility(View.GONE);
}
}

SideBar实现代码:

package com.xinbo.widget;

import android.R;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class SideBar extends View {

OnTouchingLetterChangedListener onTouchingLetterChangedListener;
// 26个字母
public static String[] b = { "","$","*", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
"V", "W", "X", "Y", "Z" };
int choose = -1;
Paint paint = new Paint();

public SideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public SideBar(Context context, AttributeSet attrs) {
super(context, attrs);
}

public SideBar(Context context) {
super(context);
}

/**
* 重写这个方法
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//if (showBkg) {
//canvas.drawColor(Color.parseColor("#4000ff00"));
//}

int height = getHeight();
int width = getWidth();
int singleHeight = height / b.length;
for (int i = 0; i < b.length; i++) {
paint.setColor(Color.GRAY);
// paint.setColor(Color.WHITE);
//paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
paint.setTextSize(20);
if (i == choose) {
paint.setColor(Color.parseColor("#3399ff"));
paint.setFakeBoldText(true);
}
float xPos = width / 2 - paint.measureText(b[i]) / 2;
float yPos = singleHeight * i + singleHeight;
canvas.drawText(b[i], xPos, yPos, paint);
paint.reset();
}

}

private boolean showBkg = false;

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float y = event.getY();
final int oldChoose = choose;
final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
final int c = (int) (y / getHeight() * b.length);

switch (action) {
case MotionEvent.ACTION_DOWN:
showBkg = true;
if (oldChoose != c && listener != null) {
if (c > 0 && c < b.length) {
listener.onTouchingLetterChanged(b[c]);
choose = c;
invalidate();
}
}

break;
case MotionEvent.ACTION_MOVE:
if (oldChoose != c && listener != null) {
if (c > 0 && c < b.length) {
listener.onTouchingLetterChanged(b[c]);
choose = c;
invalidate();
}
}
break;
case MotionEvent.ACTION_UP:
showBkg = false;
choose = -1;
invalidate();
listener.onTouchCancle();
break;
}
return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}

/**
* 向外公开的方法
*
* @param onTouchingLetterChangedListener
*/
public void setOnTouchingLetterChangedListener(
OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
}

/**
* 接口
*
* @author coder
*
*/
public interface OnTouchingLetterChangedListener {
public void onTouchingLetterChanged(String s);
public void onTouchCancle();
}

}





在团购fragment中设置选中城市

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data != null) {
/* if (resultCode == getActivity().RESULT_OK) {
Bundle bundle = data.getExtras();
String scanResult = bundle.getString("result");
Toast.makeText(getActivity(), scanResult, Toast.LENGTH_SHORT)
.show();
}*/
if (resultCode == MeituanConstants.Code.RESULT_LOCAL) {
String cityName = data.getStringExtra("cityName");
mCity.setText(cityName);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: