瀏覽代碼

完成地理位置更新和群组更新。优化Toolbar显示效果

Junqin Wang 8 年之前
父節點
當前提交
70ba0ee15c

+ 4 - 0
app/AndroidManifest.xml

@@ -129,6 +129,10 @@
         <activity android:name=".core_module.recent_contacts.activity.ContactsListActivity"
             android:theme="@style/AppTheme.NoActionBar"/>
 
+
+        <!--地区选择-->
+        <activity android:name=".core_module.location.LocationSelectActivity"
+            android:theme="@style/AppTheme.NoActionBar"/>
         <!-- 关于 -->
         <activity
             android:name="com.sheishuo.app.main.activity.AboutActivity"

+ 32 - 19
app/res/layout/base_toolbar.xml

@@ -6,42 +6,55 @@
     <android.support.v7.widget.Toolbar
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        style="@style/fullToolbarStyle">
-        <LinearLayout
+        style="@style/fullToolbarStyle"
+        android:background="@color/colorPrimary">
+        <ImageView
+            android:id="@+id/toolbar_index_ico"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/location"
+            android:visibility="gone"/>
+        <FrameLayout
             android:id="@+id/toolbar_layout"
             android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize"
             android:background="@color/colorPrimary"
-            android:gravity="center"
-            android:orientation="horizontal">
+            android:gravity="center">
 
             <TextView
-                android:id="@+id/toolbar_left"
-                android:layout_width="0dp"
+                android:id="@+id/toolbar_title"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_weight="2"
                 android:gravity="center"
                 android:textColor="@color/white"
-                android:textSize="16sp" />
+                android:textSize="18sp"
+                android:textStyle="bold"
+                android:layout_gravity="center"
+                android:paddingTop="8dp"
+                android:paddingBottom="8dp"/>
 
             <TextView
-                android:id="@+id/toolbar_title"
-                android:layout_width="0dp"
+                android:id="@+id/toolbar_left"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_weight="6"
-                android:gravity="center"
+                android:gravity="center_vertical|start"
                 android:textColor="@color/white"
-                android:textSize="18sp"
-                android:textStyle="bold" />
+                android:textSize="16sp"
+                android:layout_gravity="center_vertical|start"
+                android:padding="8dp"/>
+
+
 
             <TextView
                 android:id="@+id/toolbar_right"
-                android:layout_width="0dp"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_weight="2"
-                android:gravity="center"
                 android:textColor="@color/white"
-                android:textSize="16sp" />
+                android:gravity="center_vertical|start"
+                android:textSize="16sp"
+                android:layout_gravity="center_vertical|end"
+                android:padding="8dp"/>
+
             <LinearLayout
                 android:id="@+id/toolbar_ico_layout"
                 android:layout_weight="2"
@@ -50,6 +63,6 @@
                 android:orientation="horizontal"
                 android:visibility="gone"
                 android:gravity="center"/>
-        </LinearLayout>
+        </FrameLayout>
     </android.support.v7.widget.Toolbar>
 </LinearLayout>

+ 38 - 0
app/res/layout/location_select_activity.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <com.sheishuo.app.common.views.BaseToolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:title="地区选择"
+        app:right_text="确定"
+        style="@style/fullToolbarStyle"/>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:gravity="center"
+        android:padding="8dp">
+        <com.sheishuo.app.common.views.WheelView
+            android:id="@+id/location_select_province"
+            android:layout_weight="1"
+            android:layout_width="128dp"
+            android:layout_height="wrap_content"/>
+        <com.sheishuo.app.common.views.WheelView
+            android:id="@+id/location_select_city"
+            android:layout_weight="1"
+            android:layout_width="128dp"
+            android:layout_height="wrap_content"/>
+        <com.sheishuo.app.common.views.WheelView
+            android:id="@+id/location_select_area"
+            android:layout_weight="1"
+            android:layout_width="128dp"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+
+</LinearLayout>

+ 3 - 2
app/src/com/sheishuo/app/SheishuoApplication.java

@@ -12,6 +12,7 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import com.sheishuo.app.avchat.AVChatProfile;
+import com.sheishuo.app.common.util.location.CityDataHelper;
 import com.sheishuo.app.common.util.location.LocationHelper;
 import com.sheishuo.app.config.preference.UserPreferences;
 import com.sheishuo.app.main.activity.WelcomeActivity;
@@ -77,8 +78,8 @@ public class SheishuoApplication extends Application {
          */
         //初始化LocationHelper
         LocationHelper.init(context);
-
-
+        //初始化全国省份数据
+        CityDataHelper.init(context);
 
 
 

File diff suppressed because it is too large
+ 0 - 2
app/src/com/sheishuo/app/common/beans/CityDataBean.java


+ 86 - 1
app/src/com/sheishuo/app/common/util/location/CityDataHelper.java

@@ -1,9 +1,94 @@
 package com.sheishuo.app.common.util.location;
 
+import android.content.Context;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.sheishuo.app.common.beans.CityDataBean;
+import com.sheishuo.app.common.util.net.INet;
+import com.sheishuo.app.common.util.net.NetImpl;
+import com.sheishuo.app.common.util.net.ResponseCallback;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * Created by KN on 2017/8/14.
  */
 
 public class CityDataHelper {
-    
+    static INet net;
+    static List<CityDataBean> list;
+    static List<String> provinces;
+    static HashMap<String,List<String>> provinceCityMap;
+    static HashMap<String,List<String>> cityAreaMap;
+
+
+    public static void init(Context context){
+        Log.e("CityDataHelper","init");
+        net = new NetImpl();
+        list = new ArrayList<>();
+        provinces = new ArrayList<>();
+        provinceCityMap = new HashMap<>();
+        cityAreaMap = new HashMap<>();
+
+
+        net.getCityDataList(new ResponseCallback() {
+            @Override
+            public void onSuccess(Object object) {
+                String jsonStr = (String) object;
+                list.clear();
+                List<CityDataBean> temp = new Gson().fromJson(jsonStr,new TypeToken<List<CityDataBean>>(){}.getType());
+                list.addAll(temp);
+
+                Log.e("size",list.size()+"");
+
+                for (CityDataBean provinceBean : list){
+                    List<String> tempList = new ArrayList<>();
+                    for (CityDataBean.CityBean cityBean : provinceBean.getCity()){
+                        tempList.add(cityBean.getName());
+                        cityAreaMap.put(cityBean.getName(),cityBean.getArea());
+                    }
+                    provinces.add(provinceBean.getName());
+                    provinceCityMap.put(provinceBean.getName(),tempList);
+                }
+
+                for (String str : getAllProvince()){
+                    Log.e("selectHelper",str);
+                }
+            }
+
+            @Override
+            public void onFailed() {
+                Log.e("CityDataHelper","init failed");
+            }
+        });
+    }
+
+
+
+    public static List<String> getAllProvince(){
+        if (list != null){
+            return provinces;
+        }
+        return null;
+    }
+
+    public static List<String> getCity(String province){
+        if (provinceCityMap != null && provinceCityMap.containsKey(province)){
+            return provinceCityMap.get(province);
+        }
+        return null;
+    }
+
+
+    public static List<String> getArea(String city){
+        if (cityAreaMap != null && cityAreaMap.containsKey(city)){
+            return cityAreaMap.get(city);
+        }
+        return null;
+    }
+
 }

+ 2 - 0
app/src/com/sheishuo/app/common/util/net/INet.java

@@ -13,8 +13,10 @@ public interface INet {
     void baseQuery();
     void post(String url,FormBody body,ResponseCallback callback);
     void post(String url, RequestBody body,ResponseCallback callback);
+    void updateLocation(String province,String city,String district,ResponseCallback callback);
     void loginQuery(String mobile,String pwd,ResponseCallback callback);
     void getGiftList(ResponseCallback callback);
     void uploadCircleImgs(String filePath, ResponseCallback callback);
     void getSocialInfo(String targetID,ResponseCallback callback);
+    void getCityDataList(ResponseCallback callback);
 }

+ 63 - 0
app/src/com/sheishuo/app/common/util/net/NetImpl.java

@@ -81,6 +81,41 @@ public class NetImpl implements INet {
     }
 
     @Override
+    public void updateLocation(final String province, final String city, final String district, final ResponseCallback callback) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                try {
+                    FormBody body = new FormBody.Builder()
+                            .add("id",AccountCache.getAccount().getId())
+                            .add("province",province)
+                            .add("city",city)
+                            .add("district",district)
+                            .build();
+
+                    Request request = new Request.Builder()
+                            .post(body)
+                            .url(NetInfo.RESET_LOCATION_BY_DISTRICT)
+                            .build();
+                    Response response = client.newCall(request).execute();
+                    if (200 == response.code()){
+                        String resultStr = response.body().string();
+                        callback.onSuccess(resultStr);
+                    }else{
+                        callback.onFailed();
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    callback.onFailed();
+
+                }
+
+            }
+        }).start();
+    }
+
+    @Override
     public void loginQuery(String mobile, String pwd, final ResponseCallback callback) {
         final FormBody body = new FormBody.Builder()
                 .add("mobile", mobile)
@@ -233,4 +268,32 @@ public class NetImpl implements INet {
     }
 
 
+    @Override
+    public void getCityDataList(final ResponseCallback callback) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try{
+                    Request request = new Request.Builder()
+                            .url(NetInfo.GET_CITY_DATA)
+                            .get()
+                            .build();
+
+                    Response response = client.newCall(request).execute();
+                    if (200 == response.code()){
+                        String resultStr = response.body().string();
+                        callback.onSuccess(resultStr);
+                    }else {
+                        callback.onFailed();
+                    }
+
+                }catch (Exception e){
+                    e.printStackTrace();
+                    callback.onFailed();
+                }
+            }
+        }).start();
+    }
+
+
 }

+ 2 - 0
app/src/com/sheishuo/app/common/util/net/NetInfo.java

@@ -19,4 +19,6 @@ public class NetInfo {
     public final static String FOLLOW_TRADE = INDEX + "?m=who&c=trade&a=follow";
     public final static String UNFOLLOW_TRADE = INDEX + "?m=who&c=trade&a=delete_follow";
     public final static String GET_SOCIAL_INFO = INDEX + "?m=who&c=index&a=gift_list";
+    public final static String GET_CITY_DATA = "https://junqin.wang/API/sheishuo/cityData.json";
+    public final static String RESET_LOCATION_BY_DISTRICT= INDEX + "?m=who&c=index&a=reset_location";
 }

+ 9 - 3
app/src/com/sheishuo/app/common/views/BaseToolbar.java

@@ -7,6 +7,7 @@ import android.support.v7.widget.Toolbar;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -28,10 +29,11 @@ public class BaseToolbar extends Toolbar {
 
     private final String TITLE = "title",LEFT_TEXT = "left_text",RIGHT_TEXT = "right_text";
     private static Context context;
-    private LinearLayout toolbarLayout;
+    private FrameLayout toolbarLayout;
     private String titleStr = "",leftStr = "",rightStr = "";
     private TextView titleTV,leftTV,rightTV;
     private LinearLayout icoLayout;
+    private ImageView indexIco;
 
 
     public interface IcoBtnClickListener{
@@ -72,14 +74,18 @@ public class BaseToolbar extends Toolbar {
         leftTV = (TextView) view.findViewById(R.id.toolbar_left);
         rightTV = (TextView) view.findViewById(R.id.toolbar_right);
         icoLayout = (LinearLayout) view.findViewById(R.id.toolbar_ico_layout);
-        toolbarLayout = (LinearLayout) view.findViewById(R.id.toolbar_layout);
+        toolbarLayout = (FrameLayout) view.findViewById(R.id.toolbar_layout);
+        indexIco = (ImageView) view.findViewById(R.id.toolbar_index_ico);
     }
 
 
-    public LinearLayout getToolbarLayout() {
+    public FrameLayout getToolbarLayout() {
         return toolbarLayout;
     }
 
+    public ImageView getIndexIco(){
+        return indexIco;
+    }
     public TextView getTitleTV() {
         return titleTV;
     }

+ 431 - 0
app/src/com/sheishuo/app/common/views/WheelView.java

@@ -0,0 +1,431 @@
+package com.sheishuo.app.common.views;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by KN on 2017/8/14.
+ */
+
+public class WheelView extends ScrollView {
+    public static final String TAG = WheelView.class.getSimpleName();
+
+    public static class OnWheelViewListener {
+        public void onSelected(int selectedIndex, String item) {
+        }
+    }
+
+
+    private Context context;
+//    private ScrollView scrollView;
+
+    private LinearLayout views;
+
+    public WheelView(Context context) {
+        super(context);
+        init(context);
+    }
+
+    public WheelView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public WheelView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    //    String[] items;
+    List<String> items;
+
+    private List<String> getItems() {
+        return items;
+    }
+
+    public void setItems(List<String> list) {
+        if (null == items) {
+            items = new ArrayList<String>();
+        }
+        items.clear();
+        items.addAll(list);
+
+        // 前面和后面补全
+        for (int i = 0; i < offset; i++) {
+            items.add(0, "");
+            items.add("");
+        }
+
+        initData();
+
+    }
+
+
+    public static final int OFF_SET_DEFAULT = 1;
+    int offset = OFF_SET_DEFAULT; // 偏移量(需要在最前面和最后面补全)
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    int displayItemCount; // 每页显示的数量
+
+    int selectedIndex = 1;
+
+
+    private void init(Context context) {
+        this.context = context;
+
+//        scrollView = ((ScrollView)this.getParent());
+//        Log.d(TAG, "scrollview: " + scrollView);
+        Log.d(TAG, "parent: " + this.getParent());
+//        this.setOrientation(VERTICAL);
+        this.setVerticalScrollBarEnabled(false);
+
+        views = new LinearLayout(context);
+        views.setOrientation(LinearLayout.VERTICAL);
+        this.addView(views);
+
+        scrollerTask = new Runnable() {
+
+            public void run() {
+
+                int newY = getScrollY();
+                if (initialY - newY == 0) { // stopped
+                    final int remainder = initialY % itemHeight;
+                    final int divided = initialY / itemHeight;
+//                    Log.d(TAG, "initialY: " + initialY);
+//                    Log.d(TAG, "remainder: " + remainder + ", divided: " + divided);
+                    if (remainder == 0) {
+                        selectedIndex = divided + offset;
+
+                        onSeletedCallBack();
+                    } else {
+                        if (remainder > itemHeight / 2) {
+                            WheelView.this.post(new Runnable() {
+                                @Override
+                                public void run() {
+                                    WheelView.this.smoothScrollTo(0, initialY - remainder + itemHeight);
+                                    selectedIndex = divided + offset + 1;
+                                    onSeletedCallBack();
+                                }
+                            });
+                        } else {
+                            WheelView.this.post(new Runnable() {
+                                @Override
+                                public void run() {
+                                    WheelView.this.smoothScrollTo(0, initialY - remainder);
+                                    selectedIndex = divided + offset;
+                                    onSeletedCallBack();
+                                }
+                            });
+                        }
+
+
+                    }
+
+
+                } else {
+                    initialY = getScrollY();
+                    WheelView.this.postDelayed(scrollerTask, newCheck);
+                }
+            }
+        };
+
+
+    }
+
+    int initialY;
+
+    Runnable scrollerTask;
+    int newCheck = 50;
+
+    public void startScrollerTask() {
+
+        initialY = getScrollY();
+        this.postDelayed(scrollerTask, newCheck);
+    }
+
+    private void initData() {
+        views.removeAllViews();
+        displayItemCount = offset * 2 + 1;
+
+        for (String item : items) {
+            views.addView(createView(item));
+        }
+
+        refreshItemView(0);
+    }
+
+    int itemHeight = 0;
+
+    private TextView createView(String item) {
+        TextView tv = new TextView(context);
+        tv.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+        tv.setSingleLine(true);
+        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
+        tv.setText(item);
+        tv.setGravity(Gravity.CENTER);
+        int padding = dip2px(15);
+        tv.setPadding(padding, padding, padding, padding);
+        if (0 == itemHeight) {
+            itemHeight = getViewMeasuredHeight(tv);
+            Log.d(TAG, "itemHeight: " + itemHeight);
+            views.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, itemHeight * displayItemCount));
+            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.getLayoutParams();
+            this.setLayoutParams(new LinearLayout.LayoutParams(lp.width, itemHeight * displayItemCount));
+        }
+        return tv;
+    }
+
+
+    @Override
+    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
+        super.onScrollChanged(l, t, oldl, oldt);
+
+//        Log.d(TAG, "l: " + l + ", t: " + t + ", oldl: " + oldl + ", oldt: " + oldt);
+
+//        try {
+//            Field field = ScrollView.class.getDeclaredField("mScroller");
+//            field.setAccessible(true);
+//            OverScroller mScroller = (OverScroller) field.get(this);
+//
+//
+//            if(mScroller.isFinished()){
+//                Log.d(TAG, "isFinished...");
+//            }
+//
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+
+
+        refreshItemView(t);
+
+        if (t > oldt) {
+//            Log.d(TAG, "向下滚动");
+            scrollDirection = SCROLL_DIRECTION_DOWN;
+        } else {
+//            Log.d(TAG, "向上滚动");
+            scrollDirection = SCROLL_DIRECTION_UP;
+
+        }
+
+
+    }
+
+    private void refreshItemView(int y) {
+        int position = y / itemHeight + offset;
+        int remainder = y % itemHeight;
+        int divided = y / itemHeight;
+
+        if (remainder == 0) {
+            position = divided + offset;
+        } else {
+            if (remainder > itemHeight / 2) {
+                position = divided + offset + 1;
+            }
+
+//            if(remainder > itemHeight / 2){
+//                if(scrollDirection == SCROLL_DIRECTION_DOWN){
+//                    position = divided + offset;
+//                    Log.d(TAG, ">down...position: " + position);
+//                }else if(scrollDirection == SCROLL_DIRECTION_UP){
+//                    position = divided + offset + 1;
+//                    Log.d(TAG, ">up...position: " + position);
+//                }
+//            }else{
+////                position = y / itemHeight + offset;
+//                if(scrollDirection == SCROLL_DIRECTION_DOWN){
+//                    position = divided + offset;
+//                    Log.d(TAG, "<down...position: " + position);
+//                }else if(scrollDirection == SCROLL_DIRECTION_UP){
+//                    position = divided + offset + 1;
+//                    Log.d(TAG, "<up...position: " + position);
+//                }
+//            }
+//        }
+
+//        if(scrollDirection == SCROLL_DIRECTION_DOWN){
+//            position = divided + offset;
+//        }else if(scrollDirection == SCROLL_DIRECTION_UP){
+//            position = divided + offset + 1;
+        }
+
+        int childSize = views.getChildCount();
+        for (int i = 0; i < childSize; i++) {
+            TextView itemView = (TextView) views.getChildAt(i);
+            if (null == itemView) {
+                return;
+            }
+            if (position == i) {
+                itemView.setTextColor(Color.parseColor("#0288ce"));
+            } else {
+                itemView.setTextColor(Color.parseColor("#bbbbbb"));
+            }
+        }
+    }
+
+    /**
+     * 获取选中区域的边界
+     */
+    int[] selectedAreaBorder;
+
+    private int[] obtainSelectedAreaBorder() {
+        if (null == selectedAreaBorder) {
+            selectedAreaBorder = new int[2];
+            selectedAreaBorder[0] = itemHeight * offset;
+            selectedAreaBorder[1] = itemHeight * (offset + 1);
+        }
+        return selectedAreaBorder;
+    }
+
+
+    private int scrollDirection = -1;
+    private static final int SCROLL_DIRECTION_UP = 0;
+    private static final int SCROLL_DIRECTION_DOWN = 1;
+
+    Paint paint;
+    int viewWidth;
+
+    @Override
+    public void setBackgroundDrawable(Drawable background) {
+
+        if (viewWidth == 0) {
+            viewWidth = ((Activity) context).getWindowManager().getDefaultDisplay().getWidth();
+            Log.d(TAG, "viewWidth: " + viewWidth);
+        }
+
+        if (null == paint) {
+            paint = new Paint();
+            paint.setColor(Color.parseColor("#83cde6"));
+            paint.setStrokeWidth(dip2px(1f));
+        }
+
+        background = new Drawable() {
+            @Override
+            public void draw(Canvas canvas) {
+                canvas.drawLine(viewWidth * 1 / 6, obtainSelectedAreaBorder()[0], viewWidth * 5 / 6, obtainSelectedAreaBorder()[0], paint);
+                canvas.drawLine(viewWidth * 1 / 6, obtainSelectedAreaBorder()[1], viewWidth * 5 / 6, obtainSelectedAreaBorder()[1], paint);
+            }
+
+            @Override
+            public void setAlpha(int alpha) {
+
+            }
+
+            @Override
+            public void setColorFilter(ColorFilter cf) {
+
+            }
+
+            @Override
+            public int getOpacity() {
+                return PixelFormat.UNKNOWN;
+            }
+        };
+
+
+        super.setBackgroundDrawable(background);
+
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        Log.d(TAG, "w: " + w + ", h: " + h + ", oldw: " + oldw + ", oldh: " + oldh);
+        viewWidth = w;
+        setBackgroundDrawable(null);
+    }
+
+    /**
+     * 选中回调
+     */
+    private void onSeletedCallBack() {
+        if (null != onWheelViewListener) {
+            onWheelViewListener.onSelected(selectedIndex, items.get(selectedIndex));
+        }
+
+    }
+
+    public void setSeletion(int position) {
+        final int p = position;
+        selectedIndex = p + offset;
+        this.post(new Runnable() {
+            @Override
+            public void run() {
+                WheelView.this.smoothScrollTo(0, p * itemHeight);
+            }
+        });
+
+    }
+
+    public String getSeletedItem() {
+        return items.get(selectedIndex);
+    }
+
+    public int getSeletedIndex() {
+        return selectedIndex - offset;
+    }
+
+
+    @Override
+    public void fling(int velocityY) {
+        super.fling(velocityY / 3);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_UP) {
+
+            startScrollerTask();
+        }
+        return super.onTouchEvent(ev);
+    }
+
+    private OnWheelViewListener onWheelViewListener;
+
+    public OnWheelViewListener getOnWheelViewListener() {
+        return onWheelViewListener;
+    }
+
+    public void setOnWheelViewListener(OnWheelViewListener onWheelViewListener) {
+        this.onWheelViewListener = onWheelViewListener;
+    }
+
+    private int dip2px(float dpValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    private int getViewMeasuredHeight(View view) {
+        int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
+        int expandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);
+        view.measure(width, expandSpec);
+        return view.getMeasuredHeight();
+    }
+
+}

+ 112 - 0
app/src/com/sheishuo/app/core_module/location/LocationSelectActivity.java

@@ -0,0 +1,112 @@
+package com.sheishuo.app.core_module.location;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Spinner;
+
+import com.sheishuo.app.R;
+import com.sheishuo.app.common.util.location.CityDataHelper;
+import com.sheishuo.app.common.views.BaseToolbar;
+import com.sheishuo.app.common.views.WheelView;
+import com.sheishuo.app.uikit_implements.SheishuoUI;
+
+/**
+ * Created by KN on 2017/8/14.
+ */
+
+public class LocationSelectActivity extends SheishuoUI {
+
+    private WheelView provinceSp,citySp,areaSp;
+    private BaseToolbar toolbar;
+    private String province = "北京",city = "北京",area = "东城区";
+
+
+    //Flag
+    public final static int LOCATION_SELECTED = 30001;
+    public final static String LOCATION_PROVINCE = "province";
+    public final static String LOCATION_CITY = "city";
+    public final static String LOCATION_AREA = "area";
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.location_select_activity);
+
+        findViews();
+        init();
+    }
+
+    void findViews(){
+        provinceSp = findView(R.id.location_select_province);
+        citySp = findView(R.id.location_select_city);
+        areaSp = findView(R.id.location_select_area);
+        toolbar = findView(R.id.toolbar);
+    }
+
+    void init(){
+        toolbar.getRightTV().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Bundle data = new Bundle();
+                data.putString(LOCATION_PROVINCE,province);
+                data.putString(LOCATION_CITY,city);
+                data.putString(LOCATION_AREA,area);
+                Intent intent = new Intent();
+                intent.putExtras(data);
+                setResult(LOCATION_SELECTED,intent);
+                finish();
+            }
+        });
+        provinceSp.setOffset(1);
+        citySp.setOffset(1);
+        areaSp.setOffset(1);
+
+        provinceSp.setItems(CityDataHelper.getAllProvince());
+        citySp.setItems(CityDataHelper.getCity(provinceSp.getSeletedItem()));
+        areaSp.setItems(CityDataHelper.getArea(citySp.getSeletedItem()));
+
+
+        provinceSp.setOnWheelViewListener(new WheelView.OnWheelViewListener(){
+            @Override
+            public void onSelected(int selectedIndex, String item) {
+                super.onSelected(selectedIndex, item);
+                Log.e("locSelect",item);
+                for (String city : CityDataHelper.getCity(item)){
+                    Log.e(this.getClass().getSimpleName(),city);
+                }
+
+                citySp.setItems(CityDataHelper.getCity(item));
+                areaSp.setItems(CityDataHelper.getArea(citySp.getSeletedItem()));
+                province = item;
+                city = citySp.getSeletedItem();
+                area = areaSp.getSeletedItem();
+            }
+        });
+
+
+        citySp.setOnWheelViewListener(new WheelView.OnWheelViewListener(){
+            @Override
+            public void onSelected(int selectedIndex, String item) {
+                super.onSelected(selectedIndex, item);
+                Log.e("locSelect",item);
+                areaSp.setItems(CityDataHelper.getArea(item));
+                city = item;
+            }
+        });
+
+        areaSp.setOnWheelViewListener(new WheelView.OnWheelViewListener(){
+            @Override
+            public void onSelected(int selectedIndex, String item) {
+                super.onSelected(selectedIndex, item);
+                area = item;
+            }
+        });
+    }
+
+
+
+}

+ 6 - 1
app/src/com/sheishuo/app/main/activity/MainActivity.java

@@ -35,6 +35,7 @@ import com.sheishuo.app.avchat.activity.AVChatActivity;
 import com.sheishuo.app.chatroom.helper.ChatRoomHelper;
 import com.sheishuo.app.config.preference.UserPreferences;
 import com.sheishuo.app.contact.activity.AddFriendActivity;
+import com.sheishuo.app.core_module.location.LocationSelectActivity;
 import com.sheishuo.app.login.LoginActivity;
 import com.sheishuo.app.login.LogoutHelperBak;
 import com.sheishuo.app.main.fragment.HomeFragment;
@@ -258,8 +259,12 @@ public class MainActivity extends SheishuoUI {
         Log.e(TAG,"onActivityResult " + requestCode + "    " + resultCode);
 
         if(requestCode == MineFragment.AVATAR_SELECTED || requestCode == MineFragment.BANNER_SELECTED){
+            //我的---头像和背景图更改
             mainFragment.onActivityResult(requestCode,resultCode,data);
-        }else if (resultCode == Activity.RESULT_OK) {
+        }else if(resultCode == LocationSelectActivity.LOCATION_SELECTED){
+            //地区选择
+            mainFragment.onActivityResult(requestCode,resultCode,data);
+        } else if (resultCode == Activity.RESULT_OK) {
             if (requestCode == REQUEST_CODE_NORMAL) {
                 final ArrayList<String> selected = data.getStringArrayListExtra(ContactSelectActivity.RESULT_DATA);
                 if (selected != null && !selected.isEmpty()) {

+ 124 - 37
app/src/com/sheishuo/app/main/fragment/AreaGroupsFragment.java

@@ -1,6 +1,7 @@
 package com.sheishuo.app.main.fragment;
 
 import android.content.Context;
+import android.content.Intent;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
@@ -13,9 +14,8 @@ import com.netease.nim.uikit.contact_selector.activity.ContactSelectActivity;
 import com.netease.nim.uikit.team.helper.TeamHelper;
 import com.netease.nimlib.sdk.NIMClient;
 import com.netease.nimlib.sdk.team.TeamService;
-import com.netease.nimlib.sdk.team.constant.TeamFieldEnum;
-import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.R;
+import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.cache.GiftCache;
 import com.sheishuo.app.common.beans.GiftBean;
 import com.sheishuo.app.common.beans.NearbyGroupsBean;
@@ -24,11 +24,15 @@ import com.sheishuo.app.common.util.net.NetImpl;
 import com.sheishuo.app.common.util.net.NetInfo;
 import com.sheishuo.app.common.util.net.ResponseCallback;
 import com.sheishuo.app.common.views.BaseToolbar;
+import com.sheishuo.app.core_module.location.LocationSelectActivity;
 import com.sheishuo.app.login.beans.LoginBean;
 import com.sheishuo.app.main.activity.MainActivity;
 import com.sheishuo.app.main.adapter.AreaGroupsAdapter;
 import com.sheishuo.app.main.adapter.OnItemClickListener;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -44,9 +48,9 @@ public class AreaGroupsFragment extends MainTabFragment {
     private BaseToolbar toolbar;
     private MainActivity parent;
 
-    private RecyclerView areaGroupsRecyclerview,nearbyGroupsRecyclerview;
+    private RecyclerView areaGroupsRecyclerview, nearbyGroupsRecyclerview;
 
-    private AreaGroupsAdapter areaGroupsAdapter,nearbyGroupsAdapter;
+    private AreaGroupsAdapter areaGroupsAdapter, nearbyGroupsAdapter;
 
     private LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
     private LinearLayoutManager nearbyLayoutManager = new LinearLayoutManager(getActivity());
@@ -63,16 +67,17 @@ public class AreaGroupsFragment extends MainTabFragment {
 
     }
 
-    void findViews(){
-        parent = (MainActivity)getActivity();
+    void findViews() {
+        parent = (MainActivity) getActivity();
         toolbar = (BaseToolbar) parent.getToolBar();
         areaGroupsRecyclerview = findView(R.id.area_groups_recyclerview);
         nearbyGroupsRecyclerview = findView(R.id.area_groups_nearby_recyclerview);
     }
 
     //初始化Toolbar
-    void initToolbar(){
+    void initToolbar() {
         toolbar.init();
+
         toolbar.setTitle("谁说");
         LoginBean.DBean account = AccountCache.getAccount();
         toolbar.setLeftText(account.getCity() + account.getDistrict());
@@ -84,10 +89,20 @@ public class AreaGroupsFragment extends MainTabFragment {
 
             }
         });
+
+
+        toolbar.setLeftText("重庆市北碚区");
+        toolbar.getLeftTV().setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(getActivity(), LocationSelectActivity.class);
+                startActivityForResult(intent, 0);
+            }
+        });
     }
 
     //加载聊天室信息
-    void loadGroups(){
+    void loadGroups() {
         List<String> groupIds = new ArrayList<>();
         List<String> tempList = new ArrayList<>();
         tempList.add(AccountCache.getAccount().getCountry_room_id());
@@ -97,44 +112,44 @@ public class AreaGroupsFragment extends MainTabFragment {
 
 
         //去除空的和重复的id
-        for (int i = 0;i<tempList.size();i++){
+        for (int i = 0; i < tempList.size(); i++) {
             if (!groupIds.contains(tempList.get(i)) && !tempList.get(i).isEmpty())
                 groupIds.add(tempList.get(i));
         }
 
-        areaGroupsAdapter = new AreaGroupsAdapter(getActivity(),groupIds);
+        areaGroupsAdapter = new AreaGroupsAdapter(getActivity(), groupIds);
+        areaGroupsRecyclerview.setLayoutManager(layoutManager);
 
         areaGroupsRecyclerview.setAdapter(areaGroupsAdapter);
-        areaGroupsRecyclerview.setLayoutManager(layoutManager);
+
         areaGroupsAdapter.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(View view) {
-                String groupId = (String)view.getTag();
-                if (!NIMClient.getService(TeamService.class).queryTeamBlock(groupId).isMyTeam()){
-                    NIMClient.getService(TeamService.class).applyJoinTeam(groupId,"申请入群");
+                String groupId = (String) view.getTag();
+                if (!NIMClient.getService(TeamService.class).queryTeamBlock(groupId).isMyTeam()) {
+                    NIMClient.getService(TeamService.class).applyJoinTeam(groupId, "申请入群");
                 }
-                NimUIKit.startTeamSession(getActivity(), (String)view.getTag());
+                NimUIKit.startTeamSession(getActivity(), (String) view.getTag());
 
             }
         });
 
 
-
         //加载附近的群
         new Thread(new Runnable() {
             @Override
             public void run() {
                 FormBody body = new FormBody.Builder()
-                        .add("page","1")
-                        .add("latitude",AccountCache.getAccount().getLatitude())
-                        .add("longitude",AccountCache.getAccount().getLongitude())
+                        .add("page", "1")
+                        .add("latitude", AccountCache.getAccount().getLatitude())
+                        .add("longitude", AccountCache.getAccount().getLongitude())
                         .build();
                 net.post(NetInfo.GET_NEARBY_GROUP, body, new ResponseCallback() {
                     @Override
                     public void onSuccess(Object object) {
-                        String resultStr = (String)object;
-                        final NearbyGroupsBean bean = new Gson().fromJson(resultStr,NearbyGroupsBean.class);
-                        if (bean.getC() == 0){
+                        String resultStr = (String) object;
+                        final NearbyGroupsBean bean = new Gson().fromJson(resultStr, NearbyGroupsBean.class);
+                        if (bean.getC() == 0) {
                             final List<String> nearbyGroupIds = new ArrayList<>();
                             for (NearbyGroupsBean.DBean.ListBean entity : bean.getD().getList())
                                 nearbyGroupIds.add(entity.getId());
@@ -143,17 +158,17 @@ public class AreaGroupsFragment extends MainTabFragment {
                             getHandler().post(new Runnable() {
                                 @Override
                                 public void run() {
-                                    nearbyGroupsAdapter = new AreaGroupsAdapter(getActivity(),nearbyGroupIds);
+                                    nearbyGroupsAdapter = new AreaGroupsAdapter(getActivity(), nearbyGroupIds);
                                     nearbyGroupsRecyclerview.setAdapter(nearbyGroupsAdapter);
                                     nearbyGroupsRecyclerview.setLayoutManager(nearbyLayoutManager);
                                     nearbyGroupsAdapter.setOnItemClickListener(new OnItemClickListener() {
                                         @Override
                                         public void onItemClick(View view) {
-                                            String groupId = (String)view.getTag();
-                                            if (!NIMClient.getService(TeamService.class).queryTeamBlock(groupId).isMyTeam()){
-                                                NIMClient.getService(TeamService.class).applyJoinTeam(groupId,"申请入群");
+                                            String groupId = (String) view.getTag();
+                                            if (!NIMClient.getService(TeamService.class).queryTeamBlock(groupId).isMyTeam()) {
+                                                NIMClient.getService(TeamService.class).applyJoinTeam(groupId, "申请入群");
                                             }
-                                            NimUIKit.startTeamSession(getActivity(), (String)view.getTag());
+                                            NimUIKit.startTeamSession(getActivity(), (String) view.getTag());
                                         }
                                     });
                                 }
@@ -169,8 +184,6 @@ public class AreaGroupsFragment extends MainTabFragment {
                 });
 
 
-
-
             }
         }).start();
 
@@ -178,12 +191,12 @@ public class AreaGroupsFragment extends MainTabFragment {
 
 
     //预加载礼物信息
-    void loadGiftCache(){
+    void loadGiftCache() {
         net.getGiftList(new ResponseCallback() {
             @Override
             public void onSuccess(Object object) {
-                Log.e(TAG,"礼物列表加载成功");
-                GiftBean.DBean gift = (GiftBean.DBean)object;
+                Log.e(TAG, "礼物列表加载成功");
+                GiftBean.DBean gift = (GiftBean.DBean) object;
                 GiftCache.setCache(gift);
             }
 
@@ -195,25 +208,99 @@ public class AreaGroupsFragment extends MainTabFragment {
     }
 
 
-
     @Override
     public void setUserVisibleHint(boolean isVisibleToUser) {
         super.setUserVisibleHint(isVisibleToUser);
-        if (isVisibleToUser && toolbar != null){
+        if (isVisibleToUser && toolbar != null) {
             initToolbar();
         }
     }
 
 
-
-    protected void showToast(final String toast){
+    protected void showToast(final String toast) {
         getHandler().post(new Runnable() {
             @Override
             public void run() {
-                Toast.makeText(getActivity(),toast,Toast.LENGTH_SHORT).show();
+                Toast.makeText(getActivity(), toast, Toast.LENGTH_SHORT).show();
             }
         });
     }
 
+    public void updateAccountLocation(final String province, final String city, final String district){
+        //更新Cache
+        AccountCache.getAccount().setProvince(province);
+        AccountCache.getAccount().setCity(city);
+        AccountCache.getAccount().setDistrict(district);
+
+       net.updateLocation(province, city, district, new ResponseCallback() {
+           @Override
+           public void onSuccess(Object object) {
+               String jsonStr = (String)object;
+               try {
+                   JSONObject jsonObject = new JSONObject(jsonStr);
+
+                   String provinceRoomId = jsonObject.getJSONObject("d").getString("province");
+                   String cityRoomId = jsonObject.getJSONObject("d").getString("city");
+                   String districtRoomId = jsonObject.getJSONObject("d").getString("district");
+
+                   AccountCache.getAccount().setProvince_room_id(provinceRoomId);
+                   AccountCache.getAccount().setCity_room_id(cityRoomId);
+                   AccountCache.getAccount().setDistrict_room_id(districtRoomId);
+
+                   getHandler().post(new Runnable() {
+                       @Override
+                       public void run() {
+                           loadGroups();
+                       }
+                   });
+
+               } catch (JSONException e) {
+                   e.printStackTrace();
+               }
+
+           }
+
+           @Override
+           public void onFailed() {
+
+           }
+       });
+    }
+
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (LocationSelectActivity.LOCATION_SELECTED == resultCode) {
+            String province = data.getExtras().getString(LocationSelectActivity.LOCATION_PROVINCE);
+            String city = data.getExtras().getString(LocationSelectActivity.LOCATION_CITY);
+            String area = data.getExtras().getString(LocationSelectActivity.LOCATION_AREA);
+            if (province.equals("北京")
+                    || province.equals("天津")
+                    || province.equals("上海")
+                    || province.equals("重庆")) {
+                province = province + "市";
+            }else if (!province.equals("钓鱼岛")
+                    && !province.equals("香港")
+                    && !province.equals("澳门")){
+                province = province + "省";
+            }
+
+            if (!city.contains("特别")
+                    && !city.contains("自治")) {
+                city = city + "市";
+            }
+
+
+
+            updateAccountLocation(province,city,area);
 
+            String location = city + area;
+            if (location.length() > 6) {
+                location = location.substring(0, 6) + "...";
+            }
+
+            toolbar.setLeftText(location);
+        }
+    }
 }

+ 10 - 0
app/src/com/sheishuo/app/main/fragment/HomeFragment.java

@@ -34,6 +34,7 @@ import com.sheishuo.app.cache.AccountCache;
 import com.sheishuo.app.common.ui.viewpager.FadeInOutPageTransformer;
 import com.sheishuo.app.common.ui.viewpager.PagerSlidingTabStrip;
 import com.sheishuo.app.common.views.BottomNavigationViewEx;
+import com.sheishuo.app.core_module.location.LocationSelectActivity;
 import com.sheishuo.app.main.activity.MainActivity;
 import com.sheishuo.app.main.adapter.MainTabPagerAdapter;
 import com.sheishuo.app.main.helper.SystemMessageUnreadManager;
@@ -416,6 +417,15 @@ public class HomeFragment extends TFragment implements OnPageChangeListener, Rem
                 }
                 break;
 
+            //位置选择
+            case LocationSelectActivity.LOCATION_SELECTED:
+                for (Fragment fragment : getFragmentManager().getFragments()) {
+                    if (fragment instanceof AreaGroupsFragment)
+                        fragment.onActivityResult(requestCode, resultCode, data);
+
+                }
+                break;
+
         }
     }
 

+ 9 - 12
app/src/com/sheishuo/app/main/fragment/MineFragment.java

@@ -87,15 +87,15 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
 
     private void init(){
         initToolbar();
-        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            Window window = parent.getWindow();
-            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
-                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
-            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
-                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
-            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
-            window.setStatusBarColor(Color.TRANSPARENT);
-        }
+//        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+//            Window window = parent.getWindow();
+//            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
+//                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
+//            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+//                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+//            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
+//            window.setStatusBarColor(Color.TRANSPARENT);
+//        }
 
 
         UserInfoProvider.UserInfo user = NIMClient.getService(UserService.class).getUserInfo(AccountCache.getAccount().getId());
@@ -127,9 +127,6 @@ public class MineFragment extends MainTabFragment implements View.OnClickListene
 
         if (isVisibleToUser && toolbar != null && parent != null){
             initToolbar();
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                parent.getWindow().setStatusBarColor(getResources().getColor(android.R.color.transparent));
-            }
 
         }else if (parent != null){
             Log.e(TAG,"setFitsSystemWindows False");

Some files were not shown because too many files changed in this diff