1. 程式人生 > 實用技巧 >美團_cc城市自定義

美團_cc城市自定義

wKiom1Wls0iRJLRSAADkujfQ3P0363.jpg

wKioL1WluL6BuRyYAADTNeaw6GI082.jpg

美團_cc城市選擇介面主要功能:

  1. 按首字母進行排序;

  2. 按首字母或者英文全拼搜尋城市;

  3. 自定義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();

}


}


wKioL1WluNrQF80vAAGJS0AFPzA855.jpg


在團購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);

}


轉載於:https://blog.51cto.com/1137907860/1674726