Pārlūkot izejas kodu

手动定位功能开发

316044749 7 gadi atpakaļ
vecāks
revīzija
a32a1ea700
24 mainītis faili ar 978 papildinājumiem un 5 dzēšanām
  1. 4 0
      app/src/main/AndroidManifest.xml
  2. 3 5
      app/src/main/java/com/ynstkz/shitu/android/activity/HomeActivity.java
  3. 164 0
      app/src/main/java/com/ynstkz/shitu/android/activity/LocationSelectActivity.java
  4. 47 0
      app/src/main/java/com/ynstkz/shitu/android/adapter/HistoryCityGridAdapter.java
  5. 10 0
      app/src/main/java/com/ynstkz/shitu/android/data/SharedPreferencesUtils.java
  6. 20 0
      app/src/main/java/com/ynstkz/shitu/android/fragment/HomeFragment.java
  7. 178 0
      app/src/main/java/com/ynstkz/shitu/android/view/sortlist/CharacterParser.java
  8. 18 0
      app/src/main/java/com/ynstkz/shitu/android/view/sortlist/PinyinComparator.java
  9. 137 0
      app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SideBarView.java
  10. 124 0
      app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SortAdapter.java
  11. 24 0
      app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SortModel.java
  12. BIN
      app/src/main/res/drawable-xxhdpi/location_close.png
  13. BIN
      app/src/main/res/drawable-xxhdpi/location_icon_green.png
  14. 5 0
      app/src/main/res/drawable/shape_gray_bg.xml
  15. 10 0
      app/src/main/res/drawable/sidebar_background.xml
  16. 117 0
      app/src/main/res/layout/activity_locationselect.xml
  17. 20 0
      app/src/main/res/layout/item_history_grid.xml
  18. 46 0
      app/src/main/res/layout/item_select_city.xml
  19. 8 0
      app/src/main/res/layout/view_default_line.xml
  20. 1 0
      app/src/main/res/layout/view_home_title.xml
  21. 1 0
      app/src/main/res/layout/view_title.xml
  22. 39 0
      app/src/main/res/values/arrays.xml
  23. 1 0
      app/src/main/res/values/colors.xml
  24. 1 0
      library/src/main/res/values/dimens.xml

+ 4 - 0
app/src/main/AndroidManifest.xml

@@ -63,6 +63,10 @@
         <activity android:name=".activity.FindPasswordAffirmActivity"
             android:screenOrientation="portrait"/>
 
+        <!--定位选择-->
+        <activity android:name=".activity.LocationSelectActivity"
+            android:screenOrientation="portrait"/>
+
         <!--定位服务-->
         <meta-data android:name="com.amap.api.v2.apikey" android:value="45fb5d8b52ba4f9f214bfb4fdaf81a72"/>
         <service android:name="com.amap.api.location.APSService"/>

+ 3 - 5
app/src/main/java/com/ynstkz/shitu/android/activity/HomeActivity.java

@@ -20,6 +20,8 @@ import com.amap.api.location.AMapLocationClientOption;
 import com.amap.api.location.AMapLocationListener;
 import com.ynstkz.shitu.android.R;
 import com.ynstkz.shitu.android.base.TitleBarActivity;
+import com.ynstkz.shitu.android.data.SharedPreferencesDao;
+import com.ynstkz.shitu.android.data.SharedPreferencesUtils;
 import com.ynstkz.shitu.android.event.LocationChangedEvent;
 import com.ynstkz.shitu.android.fragment.ConfirmationDialogFragment;
 
@@ -166,12 +168,8 @@ public class HomeActivity extends TitleBarActivity implements AMapLocationListen
     public void onLocationChanged(AMapLocation amapLocation) {
         if (amapLocation != null) {
             if (amapLocation.getErrorCode() == 0) {
-                //定位成功回调信息,设置相关消息
-//                amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
-//                amapLocation.getLatitude();//获取纬度
-//                amapLocation.getLongitude();//获取经度
-//                amapLocation.getAccuracy();//获取精度信息
                 EventBus.getDefault().post(new LocationChangedEvent(amapLocation));
+                SharedPreferencesUtils.setLocation(amapLocation.getDescription());
             } else {
                 //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                 Log.e("AmapError", "location Error, ErrCode:"

+ 164 - 0
app/src/main/java/com/ynstkz/shitu/android/activity/LocationSelectActivity.java

@@ -0,0 +1,164 @@
+package com.ynstkz.shitu.android.activity;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.GridView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.ynstkz.shitu.android.R;
+import com.ynstkz.shitu.android.adapter.HistoryCityGridAdapter;
+import com.ynstkz.shitu.android.base.TitleBarActivity;
+import com.ynstkz.shitu.android.view.sortlist.CharacterParser;
+import com.ynstkz.shitu.android.view.sortlist.PinyinComparator;
+import com.ynstkz.shitu.android.view.sortlist.SideBarView;
+import com.ynstkz.shitu.android.view.sortlist.SortAdapter;
+import com.ynstkz.shitu.android.view.sortlist.SortModel;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import butterknife.Bind;
+
+/**
+ * 作者:fuchangle on 2018/2/9 11:26
+ */
+
+public class LocationSelectActivity extends TitleBarActivity {
+
+    @Bind(R.id.iv_close)
+    ImageView ivClose;
+    @Bind(R.id.tv_location)
+    TextView tvLocation;
+    @Bind(R.id.gv_history_city)
+    GridView gvHistoryCity;
+    @Bind(R.id.lv_country)
+    ListView lvCountry;
+    @Bind(R.id.tv_country_dialog)
+    TextView tvCountryDialog;
+    @Bind(R.id.sidrbar)
+    SideBarView sidrbar;
+    @Bind(R.id.ll_location_city)
+    LinearLayout llLocationCity;
+
+    private SortAdapter sortAdapter;
+    private List<SortModel> sourceDateList;
+    private PinyinComparator pinyinComparator;
+    private CharacterParser characterParser;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initView();
+        initData();
+        setListener();
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.activity_locationselect;
+    }
+
+    private void initView() {
+        pinyinComparator = new PinyinComparator();
+        characterParser = CharacterParser.getInstance();
+    }
+
+    private void initData() {
+        List<String> data = new ArrayList<>();
+        data.add("北京");
+        data.add("上海");
+        data.add("广州");
+        HistoryCityGridAdapter adapter = new HistoryCityGridAdapter(this, data);
+        gvHistoryCity.setAdapter(adapter);
+        adapter.notifyDataSetChanged();
+
+        sourceDateList = filledData(getResources().getStringArray(R.array.citys));
+        // 根据a-z进行排序源数据
+        Collections.sort(sourceDateList, pinyinComparator);
+        sortAdapter = new SortAdapter(this, sourceDateList);
+        lvCountry.setAdapter(sortAdapter);
+    }
+
+    private void setListener() {
+
+        ivClose.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                finish();
+            }
+        });
+
+        sidrbar.setOnTouchingLetterChangedListener(new SideBarView.OnTouchingLetterChangedListener() {
+            @Override
+            public void onTouchingLetterChanged(String s) {
+                //该字母首次出现的位置
+                int position = sortAdapter.getPositionForSection(s.charAt(0));
+                if (position != -1) {
+                    lvCountry.setSelection(position);
+                }
+            }
+        });
+
+        /**
+         * 定位城市
+         */
+        llLocationCity.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+
+            }
+        });
+
+        /**
+         * 城市列表
+         */
+        lvCountry.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
+//                showToast(((SortModel)sortAdapter.getItem(position)).getName());
+            }
+        });
+    }
+
+    /**
+     * 为ListView填充数据
+     *
+     * @param date
+     * @return
+     */
+    private List<SortModel> filledData(String[] date) {
+        List<SortModel> mSortList = new ArrayList<SortModel>();
+
+        for (int i = 0; i < date.length; i++) {
+            SortModel sortModel = new SortModel();
+            sortModel.setName(date[i]);
+            //汉字转换成拼音
+            String pinyin = characterParser.getSelling(date[i]);
+            String sortString = pinyin.substring(0, 1).toUpperCase();
+
+            // 正则表达式,判断首字母是否是英文字母
+            if (sortString.matches("[A-Z]")) {
+                sortModel.setSortLetters(sortString.toUpperCase());
+            } else {
+                sortModel.setSortLetters("#");
+            }
+
+            mSortList.add(sortModel);
+        }
+        return mSortList;
+    }
+
+    /**
+     * 缓存历史城市
+     * @param city
+     */
+    private void cacheLocationHistory(String city){
+
+    }
+}

+ 47 - 0
app/src/main/java/com/ynstkz/shitu/android/adapter/HistoryCityGridAdapter.java

@@ -0,0 +1,47 @@
+package com.ynstkz.shitu.android.adapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import com.common.library.adapter.CCAdapterHolder;
+import com.common.library.adapter.CCListAdapter;
+import com.ynstkz.shitu.android.R;
+
+import java.util.List;
+
+/**
+ * 作者:fuchangle on 2018/2/11 10:43
+ */
+
+public class HistoryCityGridAdapter extends CCListAdapter<String>{
+
+
+    public HistoryCityGridAdapter(Context context, List adapterContent) {
+        super(context, adapterContent);
+    }
+
+    @Override
+    public CCAdapterHolder<String> createHolder(int type) {
+        return new CCAdapterHolder<String>() {
+
+            TextView cityName;
+
+            @Override
+            public int getResource() {
+                return R.layout.item_history_grid;
+            }
+
+            @Override
+            public void initializeView(View convertView) {
+                cityName = convertView.findViewById(R.id.tv_name);
+            }
+
+            @Override
+            public void updateView(String content, int position) {
+                cityName.setText(content);
+            }
+        };
+    }
+}

+ 10 - 0
app/src/main/java/com/ynstkz/shitu/android/data/SharedPreferencesUtils.java

@@ -8,6 +8,8 @@ public class SharedPreferencesUtils {
 
     private static final String IS_LOGIN = "isLogin";
 
+    private static final String KEY_LOCATION = "key_location";
+
     /**
      * 是否登录
      * @return
@@ -15,4 +17,12 @@ public class SharedPreferencesUtils {
     public static boolean isLogin(){
         return (Boolean)SharedPreferencesDao.get(IS_LOGIN, false);
     }
+
+    public static void setLocation (String location){
+        SharedPreferencesDao.set(KEY_LOCATION, location);
+    }
+
+    public static String getLocation(){
+        return (String)SharedPreferencesDao.get(KEY_LOCATION, "未知");
+    }
 }

+ 20 - 0
app/src/main/java/com/ynstkz/shitu/android/fragment/HomeFragment.java

@@ -1,17 +1,20 @@
 package com.ynstkz.shitu.android.fragment;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.view.ViewPager;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.GridView;
+import android.widget.LinearLayout;
 import android.widget.ScrollView;
 import android.widget.TextView;
 
 import com.common.library.pulltorefresh.PullToRefreshBase;
 import com.common.library.pulltorefresh.PullToRefreshScrollView;
 import com.ynstkz.shitu.android.R;
+import com.ynstkz.shitu.android.activity.LocationSelectActivity;
 import com.ynstkz.shitu.android.base.BaseFragment;
 import com.ynstkz.shitu.android.event.LocationChangedEvent;
 
@@ -36,6 +39,8 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
     GridView gvCourseNavigation;
     @Bind(R.id.sv_main)
     PullToRefreshScrollView svMain;
+    @Bind(R.id.ll_location_select)
+    LinearLayout llLocationSelect;
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -75,6 +80,14 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
 
             }
         });
+
+        //定位选择
+        llLocationSelect.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActivityForResult(new Intent(getActivity(), LocationSelectActivity.class), 10);
+            }
+        });
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
@@ -93,6 +106,13 @@ public class HomeFragment extends BaseFragment implements PullToRefreshBase.OnRe
     }
 
     @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode){
+
+        }
+    }
+
+    @Override
     public void onDestroy() {
         super.onDestroy();
         EventBus.getDefault().unregister(this);

+ 178 - 0
app/src/main/java/com/ynstkz/shitu/android/view/sortlist/CharacterParser.java

@@ -0,0 +1,178 @@
+package com.ynstkz.shitu.android.view.sortlist;
+
+public class CharacterParser {
+	private static int[] pyvalue = new int[] { -20319, -20317, -20304, -20295,
+			-20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036,
+			-20032, -20026, -20002, -19990, -19986, -19982, -19976, -19805,
+			-19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741,
+			-19739, -19728, -19725, -19715, -19540, -19531, -19525, -19515,
+			-19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275,
+			-19270, -19263, -19261, -19249, -19243, -19242, -19238, -19235,
+			-19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006,
+			-19003, -18996, -18977, -18961, -18952, -18783, -18774, -18773,
+			-18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697,
+			-18696, -18526, -18518, -18501, -18490, -18478, -18463, -18448,
+			-18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201,
+			-18184, -18183, -18181, -18012, -17997, -17988, -17970, -17964,
+			-17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752,
+			-17733, -17730, -17721, -17703, -17701, -17697, -17692, -17683,
+			-17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427,
+			-17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733,
+			-16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470,
+			-16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423,
+			-16419, -16412, -16407, -16403, -16401, -16393, -16220, -16216,
+			-16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158,
+			-16155, -15959, -15958, -15944, -15933, -15920, -15915, -15903,
+			-15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659,
+			-15652, -15640, -15631, -15625, -15454, -15448, -15436, -15435,
+			-15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369,
+			-15363, -15362, -15183, -15180, -15165, -15158, -15153, -15150,
+			-15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121,
+			-15119, -15117, -15110, -15109, -14941, -14937, -14933, -14930,
+			-14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902,
+			-14894, -14889, -14882, -14873, -14871, -14857, -14678, -14674,
+			-14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429,
+			-14407, -14399, -14384, -14379, -14368, -14355, -14353, -14345,
+			-14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135,
+			-14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094,
+			-14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907,
+			-13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847,
+			-13831, -13658, -13611, -13601, -13406, -13404, -13400, -13398,
+			-13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343,
+			-13340, -13329, -13326, -13318, -13147, -13138, -13120, -13107,
+			-13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888,
+			-12875, -12871, -12860, -12858, -12852, -12849, -12838, -12831,
+			-12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556,
+			-12359, -12346, -12320, -12300, -12120, -12099, -12089, -12074,
+			-12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798,
+			-11781, -11604, -11589, -11536, -11358, -11340, -11339, -11324,
+			-11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041,
+			-11038, -11024, -11020, -11019, -11018, -11014, -10838, -10832,
+			-10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533,
+			-10519, -10331, -10329, -10328, -10322, -10315, -10309, -10307,
+			-10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254 };
+	public static String[] pystr = new String[] { "a", "ai", "an", "ang", "ao",
+			"ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi",
+			"bian", "biao", "bie", "bin", "bing", "bo", "bu", "ca", "cai",
+			"can", "cang", "cao", "ce", "ceng", "cha", "chai", "chan", "chang",
+			"chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu",
+			"chuai", "chuan", "chuang", "chui", "chun", "chuo", "ci", "cong",
+			"cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan",
+			"dang", "dao", "de", "deng", "di", "dian", "diao", "die", "ding",
+			"diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", "en",
+			"er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu",
+			"ga", "gai", "gan", "gang", "gao", "ge", "gei", "gen", "geng",
+			"gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun",
+			"guo", "ha", "hai", "han", "hang", "hao", "he", "hei", "hen",
+			"heng", "hong", "hou", "hu", "hua", "huai", "huan", "huang", "hui",
+			"hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin",
+			"jing", "jiong", "jiu", "ju", "juan", "jue", "jun", "ka", "kai",
+			"kan", "kang", "kao", "ke", "ken", "keng", "kong", "kou", "ku",
+			"kua", "kuai", "kuan", "kuang", "kui", "kun", "kuo", "la", "lai",
+			"lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
+			"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu",
+			"lv", "luan", "lue", "lun", "luo", "ma", "mai", "man", "mang",
+			"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie",
+			"min", "ming", "miu", "mo", "mou", "mu", "na", "nai", "nan",
+			"nang", "nao", "ne", "nei", "nen", "neng", "ni", "nian", "niang",
+			"niao", "nie", "nin", "ning", "niu", "nong", "nu", "nv", "nuan",
+			"nue", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei",
+			"pen", "peng", "pi", "pian", "piao", "pie", "pin", "ping", "po",
+			"pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", "qing",
+			"qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao",
+			"re", "ren", "reng", "ri", "rong", "rou", "ru", "ruan", "rui",
+			"run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sen",
+			"seng", "sha", "shai", "shan", "shang", "shao", "she", "shen",
+			"sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang",
+			"shui", "shun", "shuo", "si", "song", "sou", "su", "suan", "sui",
+			"sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", "teng",
+			"ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan",
+			"tui", "tun", "tuo", "wa", "wai", "wan", "wang", "wei", "wen",
+			"weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie",
+			"xin", "xing", "xiong", "xiu", "xu", "xuan", "xue", "xun", "ya",
+			"yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo", "yong",
+			"you", "yu", "yuan", "yue", "yun", "za", "zai", "zan", "zang",
+			"zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang",
+			"zhao", "zhe", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu",
+			"zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
+			"zong", "zou", "zu", "zuan", "zui", "zun", "zuo" };
+	private StringBuilder buffer;
+	private String resource;
+	private static CharacterParser characterParser = new CharacterParser();
+
+	public static CharacterParser getInstance() {
+		return characterParser;
+	}
+
+	public String getResource() {
+		return resource;
+	}
+
+	public void setResource(String resource) {
+		this.resource = resource;
+	}
+
+	/** * 汉字转成ASCII码 * * @param chs * @return */
+	private int getChsAscii(String chs) {
+		int asc = 0;
+		try {
+			byte[] bytes = chs.getBytes("gb2312");
+			if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
+				throw new RuntimeException("illegal resource string");
+			}
+			if (bytes.length == 1) {
+				asc = bytes[0];
+			}
+			if (bytes.length == 2) {
+				int hightByte = 256 + bytes[0];
+				int lowByte = 256 + bytes[1];
+				asc = (256 * hightByte + lowByte) - 256 * 256;
+			}
+		} catch (Exception e) {
+			System.out
+					.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)"
+							+ e);
+		}
+		return asc;
+	}
+
+	/** * 单字解析 * * @param str * @return */
+	public String convert(String str) {
+		String result = null;
+		int ascii = getChsAscii(str);
+		if (ascii > 0 && ascii < 160) {
+			result = String.valueOf((char) ascii);
+		} else {
+			for (int i = (pyvalue.length - 1); i >= 0; i--) {
+				if (pyvalue[i] <= ascii) {
+					result = pystr[i];
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	/** * 词组解析 * * @param chs * @return */
+	public String getSelling(String chs) {
+		String key, value;
+		buffer = new StringBuilder();
+		for (int i = 0; i < chs.length(); i++) {
+			key = chs.substring(i, i + 1);
+			if (key.getBytes().length >= 2) {
+				value = (String) convert(key);
+				if (value == null) {
+					value = "unknown";
+				}
+			} else {
+				value = key;
+			}
+			buffer.append(value);
+		}
+		return buffer.toString();
+	}
+
+	public String getSpelling() {
+		return this.getSelling(this.getResource());
+	}
+}

+ 18 - 0
app/src/main/java/com/ynstkz/shitu/android/view/sortlist/PinyinComparator.java

@@ -0,0 +1,18 @@
+package com.ynstkz.shitu.android.view.sortlist;
+
+import java.util.Comparator;
+
+public class PinyinComparator implements Comparator<SortModel>{
+	
+	public int compare(SortModel o1, SortModel o2) {
+		if (o1.getSortLetters().equals("@")
+				|| o2.getSortLetters().equals("#")) {
+			return -1;
+		} else if (o1.getSortLetters().equals("#")
+				|| o2.getSortLetters().equals("@")) {
+			return 1;
+		} else {
+			return o1.getSortLetters().compareTo(o2.getSortLetters());
+		}
+	}
+}

+ 137 - 0
app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SideBarView.java

@@ -0,0 +1,137 @@
+package com.ynstkz.shitu.android.view.sortlist;
+
+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;
+import android.widget.TextView;
+
+import com.ynstkz.shitu.android.R;
+
+/**
+ * 作者:fuchangle on 2018/2/11 11:19
+ */
+
+public class SideBarView extends View{
+
+    // 触摸事件
+    private 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", "#" };
+    private int choose = -1;// 选中
+    private Paint paint = new Paint();
+
+    private TextView mTextDialog;
+
+    public void setTextView(TextView mTextDialog) {
+        this.mTextDialog = mTextDialog;
+    }
+
+
+    public SideBarView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public SideBarView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public SideBarView(Context context) {
+        super(context);
+    }
+
+    /**
+     * 重写这个方法
+     */
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        // 获取焦点改变背景颜色.
+        int height = getHeight();// 获取对应高度
+        int width = getWidth(); // 获取对应宽度
+        int singleHeight = height / b.length;// 获取每一个字母的高度
+
+        for (int i = 0; i < b.length; i++) {
+            paint.setColor(Color.rgb(55, 145, 246));
+            paint.setAntiAlias(true);
+            paint.setTextSize(getResources().getDimension(R.dimen.company_9dp));
+            // 选中的状态
+            if (i == choose) {
+                paint.setColor(Color.parseColor("#3399ff"));
+                paint.setFakeBoldText(true);
+            }
+            // x坐标等于中间-字符串宽度的一半.
+            float xPos = width / 2 - paint.measureText(b[i]) / 2;
+            float yPos = singleHeight * i + singleHeight;
+            canvas.drawText(b[i], xPos, yPos, paint);
+            paint.reset();// 重置画笔
+        }
+
+    }
+
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent event) {
+        final int action = event.getAction();
+        final float y = event.getY();// 点击y坐标
+        final int oldChoose = choose;
+        final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
+        final int c = (int) (y / getHeight() * b.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.
+
+        switch (action) {
+            case MotionEvent.ACTION_UP:
+                setBackgroundColor(getResources().getColor(R.color.white));
+                choose = -1;//
+                invalidate();
+                if (mTextDialog != null) {
+                    mTextDialog.setVisibility(View.INVISIBLE);
+                }
+                break;
+
+            default:
+                setBackgroundResource(R.drawable.sidebar_background);
+                if (oldChoose != c) {
+                    if (c >= 0 && c < b.length) {
+                        if (listener != null) {
+                            listener.onTouchingLetterChanged(b[c]);
+                        }
+                        if (mTextDialog != null) {
+                            mTextDialog.setText(b[c]);
+                            mTextDialog.setVisibility(View.VISIBLE);
+                        }
+
+                        choose = c;
+                        invalidate();
+                    }
+                }
+
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 向外公开的方法
+     *
+     * @param onTouchingLetterChangedListener
+     */
+    public void setOnTouchingLetterChangedListener(
+            OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
+        this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
+    }
+
+    /**
+     * 接口
+     *
+     * @author coder
+     *
+     */
+    public interface OnTouchingLetterChangedListener {
+        public void onTouchingLetterChanged(String s);
+    }
+
+}

+ 124 - 0
app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SortAdapter.java

@@ -0,0 +1,124 @@
+package com.ynstkz.shitu.android.view.sortlist;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+import com.ynstkz.shitu.android.R;
+
+import java.util.List;
+
+public class SortAdapter extends BaseAdapter implements SectionIndexer {
+
+	private List<SortModel> list = null;
+	private Context mContext;
+
+	public SortAdapter(Context mContext, List<SortModel> list) {
+		this.mContext = mContext;
+		this.list = list;
+	}
+
+	/**
+	 * 当ListView数据发生变化时,调用此方法来更新ListView
+	 * 
+	 * @param list
+	 */
+	public void updateListView(List<SortModel> list) {
+		this.list = list;
+		notifyDataSetChanged();
+	}
+
+	public int getCount() {
+		return this.list.size();
+	}
+
+	public Object getItem(int position) {
+		return list.get(position);
+	}
+
+	public long getItemId(int position) {
+		return position;
+	}
+
+	public View getView(final int position, View view, ViewGroup arg2) {
+		ViewHolder viewHolder = null;
+		final SortModel mContent = list.get(position);
+		if (view == null) {
+			viewHolder = new ViewHolder();
+			view = LayoutInflater.from(mContext).inflate(R.layout.item_select_city, null);
+			viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);
+			viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);
+			view.setTag(viewHolder);
+		} else {
+			viewHolder = (ViewHolder) view.getTag();
+		}
+
+		// 根据position获取分类的首字母的Char ascii值
+		int section = getSectionForPosition(position);
+
+		// 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现
+		if (position == getPositionForSection(section)) {
+			viewHolder.tvLetter.setVisibility(View.VISIBLE);
+			viewHolder.tvLetter.setText(mContent.getSortLetters());
+		} else {
+			viewHolder.tvLetter.setVisibility(View.GONE);
+		}
+
+		viewHolder.tvTitle.setText(this.list.get(position).getName());
+
+		return view;
+
+	}
+
+	final static class ViewHolder {
+		TextView tvLetter;
+		TextView tvTitle;
+	}
+
+	/**
+	 * 根据ListView的当前位置获取分类的首字母的Char ascii值
+	 */
+	public int getSectionForPosition(int position) {
+		return list.get(position).getSortLetters().charAt(0);
+	}
+
+	/**
+	 * 根据分类的首字母的Char ascii值获取其第一次出现该首字母的位置
+	 */
+	public int getPositionForSection(int section) {
+		for (int i = 0; i < getCount(); i++) {
+			String sortStr = list.get(i).getSortLetters();
+			char firstChar = sortStr.toUpperCase().charAt(0);
+			if (firstChar == section) {
+				return i;
+			}
+		}
+
+		return -1;
+	}
+
+	/**
+	 * 提取英文的首字母,非英文字母用#代替。
+	 * 
+	 * @param str
+	 * @return
+	 */
+	private String getAlpha(String str) {
+		String sortStr = str.trim().substring(0, 1).toUpperCase();
+		// 正则表达式,判断首字母是否是英文字母
+		if (sortStr.matches("[A-Z]")) {
+			return sortStr;
+		} else {
+			return "#";
+		}
+	}
+
+	@Override
+	public Object[] getSections() {
+		return null;
+	}
+}

+ 24 - 0
app/src/main/java/com/ynstkz/shitu/android/view/sortlist/SortModel.java

@@ -0,0 +1,24 @@
+package com.ynstkz.shitu.android.view.sortlist;
+
+/**
+ * 作者:fuchangle on 2018/2/11 11:41
+ */
+
+public class SortModel {
+
+    private String name;   //显示的数据
+    private String sortLetters;  //显示数据拼音的首字母
+
+    public String getName() {
+        return name;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public String getSortLetters() {
+        return sortLetters;
+    }
+    public void setSortLetters(String sortLetters) {
+        this.sortLetters = sortLetters;
+    }
+}

BIN
app/src/main/res/drawable-xxhdpi/location_close.png


BIN
app/src/main/res/drawable-xxhdpi/location_icon_green.png


+ 5 - 0
app/src/main/res/drawable/shape_gray_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="2dp" />
+    <solid android:color="#f0f0f0" />
+</shape>

+ 10 - 0
app/src/main/res/drawable/sidebar_background.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle"
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient android:startColor="#E7E7E7" android:endColor="#E7E7E7" android:angle="90.0" />
+    
+    <corners
+        android:topLeftRadius="8dip"
+        android:bottomLeftRadius="8dip"/>
+    
+</shape>

+ 117 - 0
app/src/main/res/layout/activity_locationselect.xml

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@color/white">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="?attr/actionBarSize">
+
+        <ImageView
+            android:id="@+id/iv_close"
+            android:layout_width="@dimen/company_20dp"
+            android:layout_height="@dimen/company_20dp"
+            android:layout_marginLeft="@dimen/company_20dp"
+            android:layout_centerVertical="true"
+            android:background="@drawable/location_close"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            android:textStyle="bold"
+            android:textColor="@color/color_666"
+            android:textSize="18sp"
+            android:text="城市选择"/>
+
+    </RelativeLayout>
+
+    <include layout="@layout/view_default_line"/>
+
+    <LinearLayout
+        android:id="@+id/ll_location_city"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingLeft="@dimen/default_content_margin"
+        android:paddingRight="@dimen/default_content_margin"
+        android:paddingTop="@dimen/company_15dp"
+        android:paddingBottom="@dimen/company_15dp">
+
+        <ImageView
+            android:layout_width="@dimen/company_25dp"
+            android:layout_height="match_parent"
+            android:src="@drawable/location_icon_green"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/company_5dp"
+            android:textSize="@dimen/company_18sp"
+            android:textColor="@color/color_666"
+            android:text="定位"/>
+
+        <TextView
+            android:id="@+id/tv_location"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/company_5dp"
+            android:textSize="@dimen/company_18sp"
+            android:textColor="@color/color_999"
+            android:text="昆明市"/>
+
+    </LinearLayout>
+
+    <include layout="@layout/view_default_line"/>
+
+    <GridView
+        android:id="@+id/gv_history_city"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/default_content_margin"
+        android:layout_marginRight="@dimen/default_content_margin"
+        android:layout_marginTop="@dimen/company_10dp"
+        android:layout_marginBottom="@dimen/company_10dp"
+        android:horizontalSpacing="@dimen/company_10dp"
+        android:numColumns="4"/>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <FrameLayout
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent">
+
+            <ListView
+                android:id="@+id/lv_country"
+                android:layout_width="fill_parent"
+                android:layout_height="fill_parent"
+                android:layout_gravity="center"
+                android:divider="@null" />
+
+            <TextView
+                android:id="@+id/tv_country_dialog"
+                android:layout_width="80.0dip"
+                android:layout_height="80.0dip"
+                android:layout_gravity="center"
+                android:background="#A7A7A7"
+                android:gravity="center"
+                android:textColor="#ffffffff"
+                android:textSize="30.0dip"
+                android:visibility="invisible" />
+        </FrameLayout>
+
+        <com.ynstkz.shitu.android.view.sortlist.SideBarView
+            android:id="@+id/sidrbar"
+            android:layout_width="20.0dip"
+            android:layout_height="fill_parent"
+            android:layout_alignParentRight="true"
+            android:layout_gravity="right|center"
+            android:background="@color/white" />
+
+    </RelativeLayout>
+
+</LinearLayout>

+ 20 - 0
app/src/main/res/layout/item_history_grid.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:background="@drawable/shape_gray_bg"
+        android:paddingTop="@dimen/company_5dp"
+        android:paddingBottom="@dimen/company_5dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:textSize="@dimen/company_18sp"
+        android:textColor="@color/color_666"/>
+
+</LinearLayout>

+ 46 - 0
app/src/main/res/layout/item_select_city.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:background="#f6f6f6"
+    android:gravity="center_vertical"
+    android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/catalog"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1.0"
+        android:background="#f0f0f0"
+        android:paddingBottom="5dip"
+        android:paddingLeft="5dip"
+        android:paddingTop="5dip"
+        android:text="A"
+        android:textColor="#454545" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:background="@color/white">
+
+        <TextView
+            android:id="@+id/title"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:layout_gravity="center_vertical"
+            android:layout_marginLeft="5dip"
+            android:layout_weight="1.0"
+            android:gravity="center_vertical"
+            android:paddingBottom="10dip"
+            android:paddingTop="10dip"
+            android:textColor="#545454" />
+        
+        <TextView 
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="#e8e8e8"/>
+        
+    </LinearLayout>
+
+</LinearLayout>

+ 8 - 0
app/src/main/res/layout/view_default_line.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/company_1dp"
+    android:background="#F5F4F7"
+    android:orientation="vertical">
+
+</TextView>

+ 1 - 0
app/src/main/res/layout/view_home_title.xml

@@ -6,6 +6,7 @@
     android:background="@color/main_color">
 
     <LinearLayout
+        android:id="@+id/ll_location_select"
         android:layout_width="0dp"
         android:layout_weight="2"
         android:layout_height="match_parent"

+ 1 - 0
app/src/main/res/layout/view_title.xml

@@ -6,6 +6,7 @@
     android:layout_height="?attr/actionBarSize"
     android:background="@color/colorPrimary">
 
+
     <TextView
         android:id="@+id/tv_title"
         style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"

+ 39 - 0
app/src/main/res/values/arrays.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string-array name="citys">
+        <item>北京</item>
+        <item>黑龙江</item>
+        <item>吉林</item>
+        <item>辽宁</item>
+        <item>天津</item>
+        <item>河南</item>
+        <item>河北</item>
+        <item>内蒙</item>
+        <item>山西</item>
+        <item>陕西</item>
+        <item>甘肃</item>
+        <item>新疆</item>
+        <item>宁夏</item>
+        <item>青海</item>
+        <item>云南</item>
+        <item>重庆</item>
+        <item>四川</item>
+        <item>广东</item>
+        <item>海南</item>
+        <item>贵州</item>
+        <item>广西</item>
+        <item>浙江</item>
+        <item>上海</item>
+        <item>江苏</item>
+        <item>湖北</item>
+        <item>湖南</item>
+        <item>江西</item>
+        <item>山东</item>
+        <item>安徽</item>
+        <item>福建</item>
+        <item>深圳</item>
+        <item>东莞</item>
+    </string-array>
+
+</resources>

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -11,4 +11,5 @@
 
     <color name="default_bg">#F0F0F0</color>
     <color name="color_999">#999999</color>
+    <color name="color_666">#666666</color>
 </resources>

+ 1 - 0
library/src/main/res/values/dimens.xml

@@ -117,6 +117,7 @@
     <dimen name="company_250dp">250dp</dimen>
     <dimen name="company_350dp">350dp</dimen>
     <!-- sp单位-->
+    <dimen name="company_9sp">9sp</dimen>
     <dimen name="company_12sp">12sp</dimen>
     <dimen name="company_13sp">13sp</dimen>
     <dimen name="company_14sp">14sp</dimen>