listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序

来源:互联网 发布:淘宝店页头尺寸 编辑:程序博客网 时间:2024/05/20 05:58

listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序

第一次写CSDN的博客,写这个的原因是我看到网上很多千篇一律的listView选中后,text的改变是通过drawable里面的selector,我试过将近一周吧,没有任何作用,因为根本获取不到焦点。研究了一段时间,终于能做到根据position的改变,让那个position的item做相应的改变。废话不多说了,直接看代码吧,先把Adapter和贴出来:

package com.geonoon.parking.adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.geonoon.parking.util.UserConfig;import com.geonoon.parking.view.ViewHolder;import java.util.List;/** * Created by wyt on 2017/5/11. */public abstract class CustomAdapter<T> extends BaseAdapter {    protected Context mContext;    protected List<T> mDatas;    private int layoutID = -1;    private View layoutView ;    public CustomAdapter(Context mContext, List<T> mDatas, int layoutID) {        super();        this.mContext = mContext;        this.mDatas = mDatas;        this.layoutID = layoutID;    }    public CustomAdapter(Context mContext, List<T> mDatas, View view) {        super();        this.mContext = mContext;        this.mDatas = mDatas;        this.layoutView = view;    }    @Override    public int getCount() {        return mDatas.size();    }    @Override    public T getItem(int position) {        return mDatas.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        if (layoutID == -1) {            holder = ViewHolder.getViewHolder(mContext, parent, convertView, layoutView, position);        }else{            holder = ViewHolder.getViewHolder(mContext, parent, convertView, layoutID, position);        }        if(UserConfig.HORIZONTAL_CLICK){            holder = ViewHolder.getFirstConvertView(mContext, parent, convertView, layoutView, 0);            TextView textView = (TextView) convertView.findViewById(layoutID);            convert(holder, getItem(position),0);        }else {            convert(holder, getItem(position),position);        }        return holder.getConvertView();    }    /**     * getView()用户自己实现     * @param holder     * @param t     */    public abstract void convert(ViewHolder holder, T t, int position);    /**     * 根据搜索结果更新listview     * @param list     */    public void updateListView(List<T> list) {        this.mDatas = list;        notifyDataSetChanged();    }}

这俩是用来干啥,我就不多赘述了

package com.geonoon.parking.view;import android.content.Context;import android.graphics.Bitmap;import android.text.SpannableStringBuilder;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.TextView;import com.geonoon.parking.util.UserConfig;/** * Created by wyt on 2017/5/11. */public class ViewHolder {    private SparseArray<View> mViews;    private View mConvertView;    private int mPosition;//  private static LoadImage mImageLoader  = new LoadImage();    public ViewHolder(Context context, ViewGroup parent, int layoutID,                      int position) {        this.mPosition = position;        mViews = new SparseArray<View>();        mConvertView = LayoutInflater.from(context).inflate(layoutID, parent,                false);        mConvertView.setTag(this);    }    public ViewHolder(Context context, ViewGroup parent, View view,                      int position) {        this.mPosition = position;        mViews = new SparseArray<View>();        mConvertView = view;        mConvertView.setTag(this);    }    public static ViewHolder getViewHolder(Context context, ViewGroup parent,                                           View convertView, int layoutID, int position) {        if (convertView == null) {            return new ViewHolder(context, parent, layoutID, position);        } else {            ViewHolder holder = (ViewHolder) convertView.getTag();            holder.mPosition = position;            return holder;        }    }    public static ViewHolder getViewHolder(Context context, ViewGroup parent,                                           View convertView, View view, int position) {        if (convertView == null) {            return new ViewHolder(context, parent, view, position);        } else {            ViewHolder holder = (ViewHolder) convertView.getTag();            holder.mPosition = position;            return holder;        }    }    public View getConvertView() {        return mConvertView;    }    public static ViewHolder getFirstConvertView(Context context, ViewGroup parent,                                                 View convertView, View view, int position) {        if (convertView == null) {            return new ViewHolder(context, parent, view, 0);        } else {            ViewHolder holder = (ViewHolder) convertView.getTag();            return holder;        }    }    public <T extends View> T getView(int viewID) {        View view = mViews.get(viewID);        if (view == null) {            view = mConvertView.findViewById(viewID);            mViews.put(viewID, view);        }        return (T) view;    }    /**     * 在网络上获取图片并设置给imageView     * @param viewID     * @param url     * @param resID 图片加载的时候默认显示的资源     * @return     *///  public ViewHolder setImageForURL(int viewID, String url, int resID) {//      ImageView iv = getView(viewID);//      iv.setTag(url);//      iv.setImageResource(resID);//      mImageLoader.getBitmapFromAsyncTask(iv, url);//      return this;//  }    /**     * 为TextView设置文字抽取处理     *     * @param viewID     * @param text     * @return     */    public ViewHolder setText(int viewID, String text) {        TextView tv = getView(viewID);        tv.setText(text);        return this;    }    public ViewHolder setText(int viewID, SpannableStringBuilder sb) {        TextView tv = getView(viewID);        tv.setText(sb);        return this;    }    public ViewHolder setVisibility(int viewID, int visibility) {        View view = getView(viewID);        view.setVisibility(visibility);        return this;    }    /**     * 为imageView设置图片、通过resource查找资源     *     * @param viewID     * @param resID     * @return     */    public ViewHolder setImageResource(int viewID, int resID) {        ImageView iv = getView(viewID);        iv.setImageResource(resID);        return this;    }    /**     * 通过bitmap对象为imageView设置背景     *     * @param viewID     * @param bitmap     * @return     */    public ViewHolder setImageBitmap(int viewID, Bitmap bitmap) {        ImageView iv = getView(viewID);        iv.setImageBitmap(bitmap);        return this;    }    /**     * 设置CheckBox选中状态     *     * @param viewID     * @param isChecked     * @return     */    public ViewHolder setCheckBoxState(int viewID, boolean isChecked) {        CheckBox cb = getView(viewID);        cb.setChecked(isChecked);        return this;    }    public Boolean getCheckBoxState(int viewID) {        CheckBox cb = getView(viewID);        return cb.isChecked();    }    public ViewHolder setProgres(int viewID, int diff) {        ProgressBar bar = getView(viewID);        bar.setProgress(diff);        return this;//指定增加的进度    }}

好了,现在来看主要代码吧,适配器的初始化和刷新方法,调用updateUI(),由于代码本身是公司项目,也不便上传demo。
顺道一提,公司需求我做的列表,前两个是固定不动的,“地图”和“全部”我用的是TextView定死,后面的是列表,如图这里写图片描述

这里就涉及到第二个技术点了,比如说,我选择“医疗保健”后,点击楼层,我的列表会刷新,条目数肯定不是现在的条目数了,而且“医疗保健”的位置我也不知道会在第几个,那么我的焦点如何还保留在“医疗保健”上?

//通用适配器   // private FindShopEntity findShopEntity;    private CustomAdapter<AreaType> mAdapter;    private ArrayList<AreaType> mList = new ArrayList<>();    private ArrayList<AreaType> newList = new ArrayList<>();    private TextView oldView = null;      //点击列表之后,上一个textView    private TextView firstTxt = null;     //这个是公司需求,是左侧列表中的第一个textView    private void updateUI() {        if (mList.size() <= 0) {            if (mAdapter != null) {                mAdapter.updateListView(mList);            }        } else {//            layoutNoCard.setVisibility(View.GONE);            if (mAdapter == null) {                mAdapter = new CustomAdapter<AreaType>(FindShopActivity.this, mList, R.layout.item_findshop) {                    @Override                    public void convert(ViewHolder holder, final AreaType areaType, int position) {                        holder.setText(R.id.item_fs_txt, areaType.getDesc());                        final TextView txt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);                        if (position == 0) {                            firstTxt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);                        }                        if (firstTxt != null) {//                            firstTxt.setTextColor(getResources().getColor(R.color.radioBtnBlue));                            if ((!clickList && allClick)) {                                firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                                LogUtils.e("radioBtnGray");                            }                        }                        holder.getView(R.id.item_fs_ll).setOnClickListener(new View.OnClickListener() {                            @Override                            public void onClick(View v) {                                currentType = areaType.getType();                                clickList();                                if (oldView == null) {//                                    if (firstTxt != null) {//                                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));//                                    }                                    //第一次点击                                    oldView = txt;                                    txt.setTextColor(mContext.getResources().getColor(R.color.searchBgBlue));                                } else {                                    //非第一次点击                                    //把上一次点击的 变化                                    if (firstTxt != null) {                                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                                    }                                    oldView.setTextColor(mContext.getResources().getColor(R.color.radioBtnGray));                                    txt.setTextColor(mContext.getResources().getColor(R.color.searchBgBlue));                                    //保存oldView                                    oldView = txt;                                }                            }                        });                    }                };                if (listView != null) {                    listView.setAdapter(mAdapter);                }            } else {                oldView.setTextColor(getResources().getColor(R.color.radioBtnGray));                if (firstTxt != null) {                     firstTxt.setTextColor(getResources().getColor(R.color.radioBtnBlue));                    LogUtils.e("radioBtnBlue");                    LogUtils.e("firstTxt:" + firstTxt.getText().toString());                    if ((!clickList && allClick)) {                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                        LogUtils.e("radioBtnGray");                    }                }                boolean goNext = false;                //clickList 在clickList()中置为true                //不是第一次 点击“全部”&&是点击了左侧列表&&是点击了横向楼层                if (!firstClickAll && clickList && horizontalClick) {                //给点击楼层后的list新排序                    newList.clear();                    if (!goNext) {                        for (int i = 0; i < mList.size(); i++) {                            if ((mList.get(i).getType()).equals(currentType)) {                                newList.add(mList.get(i));                            }                        }                        goNext = true;                    }                    if (goNext) {                        for (int i = 0; i < mList.size(); i++) {                            if (!(mList.get(i).getType()).equals(currentType)) {                                newList.add(mList.get(i));                            }                        }                    }                    mAdapter.updateListView(newList);                } else {                    mAdapter.updateListView(mList);                }            }        }    }    private void clickList() {        if (firstClickAll) {            firstClickAll = false;        }        /**fsTxtMap.setSelected(false);        fsTxtAll.setSelected(false);        contentContainer.setVisibility(View.GONE);        shopListWV.setVisibility(View.VISIBLE);        canTouchRl.setVisibility(View.VISIBLE);        locationSideBar.setVisibility(View.VISIBLE);        shopDetailWv.setVisibility(View.GONE);**/        clickList = true;        allClick = true;        /**mapClick = false;        horizontalListView.setVisibility(View.VISIBLE);        showShopsByType(currentType);**/    }

看到这里,小伙伴应该明白我这是个什么逻辑了。我设置了一个oldView,oldView最开始记录了第一次点击的item的text,点击第二个开始,oldView先变成初始灰,并记录当前item的TextView。

关机点击楼层后,我做了一个排序,就是你点的这个类别,如“餐饮”,无论楼层怎么点击,这个类别“餐饮”一直放在list的首端,也就是点击楼层后的第一次,默认position为0的firstText为选中色。

  • 一开始选中了“餐饮”
    这里写图片描述

  • 然后点击上面horizantal的某个楼层,这里是“2”层
    这里写图片描述

  • 无论点哪一层,“餐饮”始终排在第一个呢
    这里写图片描述

如果对代码和我的解说还是有困惑的,我就直接把代码贴出来吧,自己看咯

package com.geonoon.parking.activity.findshop;import android.animation.ObjectAnimator;import android.animation.ValueAnimator;import android.bluetooth.BluetoothAdapter;import android.content.Context;import android.content.Intent;import android.hardware.SensorManager;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.os.RemoteException;import android.support.v4.app.FragmentTransaction;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.animation.AccelerateInterpolator;import android.webkit.JavascriptInterface;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.AdapterView;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import com.amap.api.services.geocoder.GeocodeResult;import com.amap.api.services.geocoder.GeocodeSearch;import com.amap.api.services.geocoder.RegeocodeResult;import com.geonoon.parking.PosManager;import com.geonoon.parking.R;import com.geonoon.parking.activity.common.BaseActivity;import com.geonoon.parking.adapter.CustomAdapter;import com.geonoon.parking.adapter.HorizontalListViewAdapter;import com.geonoon.parking.bo.GnBeacon;import com.geonoon.parking.dao.GeoNoonClient;import com.geonoon.parking.entity.AreaType;import com.geonoon.parking.entity.FindShopEntity;import com.geonoon.parking.entity.FindShopExpandChildEntity;import com.geonoon.parking.entity.FindShopExpandGroupEntity;import com.geonoon.parking.foldmenu.FoldingLayout;import com.geonoon.parking.foldmenu.OnFoldListener;import com.geonoon.parking.geonoonmap.entity.Route;import com.geonoon.parking.geonoonmap.entity.IndoorPoi;import com.geonoon.parking.geonoonmap.entity.RoutingOption;import com.geonoon.parking.geonoonmap.fragment.GMAbstractFragment;import com.geonoon.parking.geonoonmap.option.GMIndoorOptions;import com.geonoon.parking.geonoonmap.routing.Routing;import com.geonoon.parking.geonoonmap.routing.offline.algorithm.RoutingDijkstraBi;import com.geonoon.parking.geonoonmap.routing.offline.topology.GraphManager;import com.geonoon.parking.geonoonmap.routing.online.RoutingOnline;import com.geonoon.parking.geonoonmap.search.GMIndoorSearchFragment;import com.geonoon.parking.geonoonmap.util.ConstantParams;import com.geonoon.parking.locating.Locator;import com.geonoon.parking.locating.OfflinePedestrianLocator;import com.geonoon.parking.locating.OnlinePedestrianLocator;import com.geonoon.parking.locating.OnlineVehicleLocator;import com.geonoon.parking.locating.VehicleLocator;import com.geonoon.parking.locating.pedestrianLocator;import com.geonoon.parking.sensor.OrientationHandler;import com.geonoon.parking.sensor.StepDetectionHandler;import com.geonoon.parking.util.Constants;import com.geonoon.parking.util.LogUtils;import com.geonoon.parking.util.StringUtils;import com.geonoon.parking.util.SysConfig;import com.geonoon.parking.util.UserConfig;import com.geonoon.parking.view.CanTouchRelativeLayout;import com.geonoon.parking.view.HorizontalListView;import com.geonoon.parking.view.SideBar;import com.geonoon.parking.view.ViewHolder;import com.google.gson.JsonArray;import com.google.gson.JsonObject;import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;import com.mapbox.mapboxsdk.geometry.LatLng;import com.mapbox.mapboxsdk.maps.MapboxMap;import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;import com.mapbox.services.api.utils.turf.TurfMeasurement;import com.mapbox.services.commons.geojson.Point;import org.altbeacon.beacon.Beacon;import org.altbeacon.beacon.BeaconConsumer;import org.altbeacon.beacon.BeaconManager;import org.altbeacon.beacon.BeaconParser;import org.altbeacon.beacon.Identifier;import org.altbeacon.beacon.RangeNotifier;import org.altbeacon.beacon.Region;import org.greenrobot.eventbus.EventBus;import org.json.JSONArray;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import java.util.TreeMap;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;import retrofit2.Call;import retrofit2.Callback;import retrofit2.Response;/** * Created by zhang on 2017/4/27. * 1室外地图,点一个商城2商城商铺陈列伴有商铺地图3商铺位置4导航路线5开始导航 */public class FindShopActivity extends BaseActivity implements BeaconConsumer, RangeNotifier, GeocodeSearch        .OnGeocodeSearchListener, AMapLocationListener {    @BindView(R.id.list_view)    ListView listView;    @BindView(R.id.fs_txt_map)    TextView fsTxtMap;    @BindView(R.id.fs_txt_all)    TextView fsTxtAll;    @BindView(R.id.shop_ad_wv)    WebView shopAdWV;    @BindView(R.id.shop_list_wv)    WebView shopListWV;    @BindView(R.id.horizontal_list_view)    HorizontalListView horizontalListView;//    private String buildNum = "";    private static final String MAPFRAGMENT_TAG = "com.geonoon.geonoonmap";    @BindView(R.id.contentContainer)    FrameLayout contentContainer;    //商铺简介    @BindView(R.id.shop_detail_wv)    WebView shopDetailWv;    @BindView(R.id.fs_citys)    TextView fsCitys;    @BindView(R.id.can_touch_rl)    CanTouchRelativeLayout canTouchRl;    @BindView(R.id.horizontal_list_left)    ImageView horizontalListLeft;    @BindView(R.id.horizontal_list_right)    ImageView horizontalListRight;    @BindView(R.id.location_sideBar)    SideBar locationSideBar;    @BindView(R.id.fs_notice)    TextView fsNotice;    @BindView(R.id.ll_parent)    LinearLayout llParent;    private GMAbstractFragment mapFragment;    private String TAG_ARROW = "arrow";    //    private String TAG_ITEM = "service_item";    private Map<Integer, List<JsonObject>> floorMap = new HashMap<>();    private Map<String, List<JsonObject>> typeMap = new HashMap<>();    private JsonArray floors;    private Map<String, String> shopTypes = new HashMap<>();    private String currentType;    private int currentFloor = 0;    private FindShopExpandGroupEntity groupEntity;    private FindShopExpandChildEntity childEntity;    //通用适配器    private FindShopEntity findShopEntity;    private CustomAdapter<AreaType> mAdapter;    private ArrayList<AreaType> mList = new ArrayList<>();    private ArrayList<AreaType> newList = new ArrayList<>();    private Object[] array;    private Object[] leftListArray;    private int[] floor;    //data for WebView    final String findShopPageBannerUrl = "file:///android_asset/html/find_shop_banner.html";    final String baseShopListUrl = "file:///android_asset/html/shop_list.html";    final String shopDetailUrl = "file:///android_asset/html/shop_detail.html";    final String shopAdUrl = "file:///android_asset/html/shop_ad.html";    final JsInterface jsInterface = new JsInterface(this);    private boolean clickList = false;    private boolean allClick = false;    private boolean mapClick = true;    private boolean firstClickAll = true;    private boolean horizontalClick = false;    HorizontalListViewAdapter hListViewAdapter;    ImageView previewImg;    View olderSelectView = null;    /*高德定位SDK*/    private AMapLocationClient mLocationClient;    private AMapLocationClientOption mLocationOption;    //室内    /*蓝牙扫描相关*/    private BeaconManager mBeaconManager;    private Identifier majorId = Identifier.parse(SysConfig.positioningMajor);    private Identifier minorId = SysConfig.positioningMinor.equals("") ? null : Identifier.parse(SysConfig            .positioningMinor);    private Region region = new Region("all-beacons-region", null, majorId, minorId);    private boolean beaconServiceConnected = false;    private int scanRound = 0;    private int scanRoundStatic = 0;    private TreeMap<Integer, GnBeacon> cachedBeacons = new TreeMap<>();    /*监测手机与正北方向夹角变化*/    public float angleNorth = 0;    private OrientationHandler orh;    private OrientationHandler.OrientationListener mOrientationListener = new OrientationHandler.OrientationListener() {        public void newOrientation(float angle1, float angle2) {            angleNorth = angle1;            if (UserMode == Constants.USER_MODE_WALKING) {                drawCurLocationMarker(false);            }        }    };    private boolean outdoorMapReady = false;    /*室内地图UI控件*/    private View indoorUI;    private EditText indoorSearchEntrance;    private Spinner poiSpinner;    private int PoiCode;    private static int pointStatus = Constants.POINT_STATUS_STATIC;    private TextView tvIns;    private JSONArray instructions;    private View indoorLocating, navigation, mark_lot, im;    private String buildingId = "b001b1ftn7";    /*用户驾车or步行*/    public int UserMode;    /*用户当前是否在室内*/    private boolean isIndoor = false;    /*用户室内位置与楼层*/    private PosManager posManager;    private double[] prePos = null;    //自己所在的自定义的    private double longitude = 114.34909346493913;//经度    private double latitude = 30.584524493658066;//纬度    private double[] curPos = {longitude, latitude};    private int curPosFloor = 0;    /*用户室内选取目标的位置与楼层*/    private double[] curTarget = {0, 0};    private int curTargetFloor;    /*用户步行PDR信息*/    private StepDetectionHandler sdh;    private StepDetectionHandler.StepDetectionListener mStepDetectionListener = new StepDetectionHandler            .StepDetectionListener() {        public void newStep(final float stepSize) {            scanRoundStatic = 0;            if (posManager.isPdrInitialized()) {                stepCount++;                posManager.updatePdrAfterStep(stepSize, angleNorth);                if (pointStatus == Constants.POINT_STATUS_FOLLOW) {                    curPos[0] = longitude;                    curPos[1] = latitude;                    drawCurLocationMarker(false);                }            }        }    };    private int stepCount = 0;    private int humanStatus = Constants.HUMAN_STATUS_UNKNOWN;    public JsonArray buildings;    /*公共UI控件*/    private GMIndoorSearchFragment indoorSearchFragment;    private MapboxMap theMap;    private boolean shouldSetView = false;  //表示当前更新定位时,是否需要设置为地图中心,以及旋转操作(仅限室内)    private ImageView modeDriving, modeWalking;    /**/    int curFrame;    double[] deltaLen = {0, 0};    int frameCount = 20;    long delay = 3000L / frameCount;    Handler handler = new Handler();    Runnable runnable = new Runnable() {        @Override        public void run() {            curFrame++;            if (curFrame <= frameCount) {                curPos[0] += deltaLen[0];                curPos[1] += deltaLen[1];                drawCurLocationMarker(false);                handler.postDelayed(this, delay);            } else {                handler.removeCallbacks(runnable);                pointStatus = Constants.POINT_STATUS_STATIC;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_findshop);        ButterKnife.bind(this);        initView();        getOutBuildings();//        EventBus.getDefault().register(this);        initManager();    }    @Override    protected void onDestroy() {        super.onDestroy();        EventBus.getDefault().unregister(this);        if (mLocationClient != null) {            mLocationClient.onDestroy();            mLocationClient = null;        }    }    private void initView() {        clickMap();        fsNotice.setVisibility(View.GONE);        initGeonoonMap(buildingId);        findViewById(R.id.findshop_back).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                finish();            }        });        shopAdWV.loadUrl(findShopPageBannerUrl);        shopAdWV.getSettings().setJavaScriptEnabled(true);        shopAdWV.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                return false;            }        });        shopListWV.getSettings().setJavaScriptEnabled(true);        shopListWV.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);        shopListWV.getSettings().setAllowFileAccessFromFileURLs(true);        shopListWV.getSettings().setDefaultTextEncodingName("utf-8");        shopListWV.getSettings().setDomStorageEnabled(true);        shopListWV.addJavascriptInterface(jsInterface, "android");        if (Build.VERSION.SDK_INT >= 19) {            shopListWV.setWebContentsDebuggingEnabled(true);        }        shopListWV.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                return (event.getAction() == MotionEvent.ACTION_MOVE);            }        });        shopListWV.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                shopListWV.loadUrl(url);                return true;            }            @Override            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);                shopListWV.loadUrl("javascript:getShopKey()");            }        });        if (SysConfig.useCache) {            shopListWV.getSettings().setAppCacheEnabled(true);        } else {            shopListWV.getSettings().setAppCacheEnabled(false);            shopListWV.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);        }        shopDetailWv.getSettings().setJavaScriptEnabled(true);        shopDetailWv.addJavascriptInterface(jsInterface, "android");        shopDetailWv.setWebViewClient(new WebViewClient() {            @Override            public boolean shouldOverrideUrlLoading(WebView view, String url) {                return false;            }        });        canTouchRl.setmSetOnSlideListener(new CanTouchRelativeLayout.setOnSlideListener() {            @Override            public void onRightToLeftSlide() {                LogUtils.e("onRightToLeftSlide");            }            @Override            public void onLeftToRightSlide() {                LogUtils.e("onLeftToRightSlide");            }            @Override            public void onTopToDownSlide() {                LogUtils.e("onTopToDownSlide");                shopListWV.post(new Runnable() {                    @Override                    public void run() {                        shopListWV.loadUrl("javascript:prePage()");                    }                });            }            @Override            public void onDownToTopSlide() {                LogUtils.e("onDownToTopSlide");                shopListWV.post(new Runnable() {                    @Override                    public void run() {                        shopListWV.loadUrl("javascript:nextPage()");                    }                });            }        });        locationSideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {            @Override            public void onTouchingLetterChanged(final String s) {                fsNotice.setVisibility(View.VISIBLE);                fsNotice.setText(s);                LogUtils.e("s:" + s);                shopListWV.post(new Runnable() {                    @Override                    public void run() {                        shopListWV.loadUrl("javascript:displayShopsByLetter(\"" + s + "\")");                    }                });            }            @Override            public void onTouchUp() {                fsNotice.setVisibility(View.GONE);            }        });    }    private void initFloor() {        if (clickList || allClick) {            int size = array.length;            floor = new int[size];            for (int i = 0; i < size; i++) {                floor[i] = (int) array[i];            }        }        hListViewAdapter = new HorizontalListViewAdapter(getApplicationContext(), floor);        hListViewAdapter.setmSetOnSlideListener(new HorizontalListViewAdapter.setOnSlideListener() {            @Override            public void getFirstPosition() {                LogUtils.e("getFirstPosition");                horizontalListLeft.setBackground(null);                horizontalListRight.setBackground(getResources().getDrawable(R.drawable.right_light));            }            @Override            public void getLastPosition() {                LogUtils.e("getLastPosition");                horizontalListLeft.setBackground(getResources().getDrawable(R.drawable.left_light));                horizontalListRight.setBackground(null);            }            @Override            public void getNormalPosition() {                LogUtils.e("getNormalPosition");                horizontalListLeft.setBackground(getResources().getDrawable(R.drawable.left_light));                horizontalListRight.setBackground(getResources().getDrawable(R.drawable.right_light));            }        });        horizontalListView.setAdapter(hListViewAdapter);        horizontalListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            //array            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                // TODO Auto-generated method stub                horizontalClick = true;                hListViewAdapter.setSelectIndex(position);                hListViewAdapter.notifyDataSetChanged();                currentFloor = floors.get(position).getAsInt();                if (clickList) {                    showShopByFloorAndType(floor[position]);                } else {                    showShopByFloor(floor[position]);                }            }        });    }    private void showShopByFloor4LeftList(int floor) {        GeoNoonClient.getService().getShopsByFloor("b001b1ftn7", floor).enqueue(new Callback<JsonObject>() {            @Override            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                if (response.body().get("code").getAsInt() == 0) {                    floorMap.clear();                    typeMap.clear();                    try {                        JsonObject res = response.body();                        LogUtils.e("res:" + res);                        int code = res.get("code").getAsInt();                        if (code == 0) {                            JsonArray shops = res.get("data").getAsJsonArray();                            for (int i = 0; i < shops.size(); i++) {                                JsonObject shop = shops.get(i).getAsJsonObject();                                String type = shop.get("type").getAsString();                                if (!typeMap.containsKey(type)) {                                    typeMap.put(type, new ArrayList<JsonObject>());                                }                                typeMap.get(type).add(shop);                            }                            LogUtils.e("typeMap:" + typeMap.keySet());                        }                        initLeftList();                    } catch (Exception e) {                        e.printStackTrace();                        Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                    } finally {//                    showProgress(false);                    }                }            }            @Override            public void onFailure(Call<JsonObject> call, Throwable t) {            }        });    }    private void showShopByFloor(int floor) {        GeoNoonClient.getService().getShopsByFloor("b001b1ftn7", floor).enqueue(new Callback<JsonObject>() {            @Override            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                if (response.body().get("code").getAsInt() == 0) {                    jsInterface.setJsonData(response.body().get("data").getAsJsonArray().toString());                    shopListWV.loadUrl(baseShopListUrl);                    EditText focusView = null;                    String error = "";                    floorMap.clear();                    typeMap.clear();                    try {                        JsonObject res = response.body();                        LogUtils.e("res:" + res);                        int code = res.get("code").getAsInt();                        if (code == 0) {                            JsonArray shops = res.get("data").getAsJsonArray();                            for (int i = 0; i < shops.size(); i++) {                                JsonObject shop = shops.get(i).getAsJsonObject();                                int floor = shop.get("floor").getAsInt();                                if (!floorMap.containsKey(floor)) {                                    floorMap.put(floor, new ArrayList<JsonObject>());                                }                                floorMap.get(floor).add(shop);                                String type = shop.get("type").getAsString();                                if (!typeMap.containsKey(type)) {                                    typeMap.put(type, new ArrayList<JsonObject>());                                }                                typeMap.get(type).add(shop);                            }                            LogUtils.e("floorMap:" + floorMap.keySet());                        }                        initLeftList();                    } catch (Exception e) {                        e.printStackTrace();                        Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                    } finally {//                    showProgress(false);                        if (focusView != null) {                            focusView.setError(error);                            focusView.requestFocus();                        }                    }                }            }            @Override            public void onFailure(Call<JsonObject> call, Throwable t) {            }        });    }    private void showShopByFloorAndType(final int floor) {        GeoNoonClient.getService().getShopsByFloorAndType("b001b1ftn7", floor, currentType).enqueue                (new Callback<JsonObject>() {                    @Override                    public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                        if (response.body().get("code").getAsInt() == 0) {                            jsInterface.setJsonData(response.body().get("data").getAsJsonArray().toString());                            shopListWV.loadUrl(baseShopListUrl);                            EditText focusView = null;                            String error = "";                            floorMap.clear();                            typeMap.clear();                            try {                                JsonObject res = response.body();                                LogUtils.e("res:" + res);                                int code = res.get("code").getAsInt();                                if (code == 0) {                                    JsonArray shops = res.get("data").getAsJsonArray();                                    for (int i = 0; i < shops.size(); i++) {                                        JsonObject shop = shops.get(i).getAsJsonObject();                                        int floor = shop.get("floor").getAsInt();                                        if (!floorMap.containsKey(floor)) {                                            floorMap.put(floor, new ArrayList<JsonObject>());                                        }                                        floorMap.get(floor).add(shop);                                    }                                    LogUtils.e("floorMap:" + floorMap.keySet());                                    LogUtils.e("typeMap:" + typeMap.keySet());                                }                                showShopByFloor4LeftList(floor);                            } catch (Exception e) {                                e.printStackTrace();                                Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT)                                        .show();                            } finally {//                    showProgress(false);                                if (focusView != null) {                                    focusView.setError(error);                                    focusView.requestFocus();                                }                            }                        }                    }                    @Override                    public void onFailure(Call<JsonObject> call, Throwable t) {                    }                });    }    private void showShopByBuilding() {        GeoNoonClient.getService().getShopsByBuilding("b001b1ftn7").enqueue(new Callback<JsonObject>() {            @Override            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                if (response.body().get("code").getAsInt() == 0) {                    jsInterface.setJsonData(response.body().get("data").getAsJsonArray().toString());                    shopListWV.loadUrl(baseShopListUrl);                    EditText focusView = null;                    String error = "";                    floorMap.clear();                    try {                        JsonObject res = response.body();                        LogUtils.e("res:" + res);                        int code = res.get("code").getAsInt();                        if (code == 0) {                            JsonArray shops = res.get("data").getAsJsonArray();                            for (int i = 0; i < shops.size(); i++) {                                JsonObject shop = shops.get(i).getAsJsonObject();                                int floor = shop.get("floor").getAsInt();                                if (!floorMap.containsKey(floor)) {                                    floorMap.put(floor, new ArrayList<JsonObject>());                                }//                            floorMap.get(1)                                floorMap.get(floor).add(shop);                            }                            LogUtils.e("floorMap:" + floorMap.keySet());                            initDemoData();                        }                    } catch (Exception e) {                        e.printStackTrace();                        Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                    } finally {//                    showProgress(false);                        if (focusView != null) {                            focusView.setError(error);                            focusView.requestFocus();                        }                    }                }            }            @Override            public void onFailure(Call<JsonObject> call, Throwable t) {            }        });    }    private void initDemoData() {        //把akeySet扔到groups里面去        if (clickList || allClick) {            Set<Integer> set = floorMap.keySet();            array = set.toArray();            LogUtils.e("array.size:" + array.length);            //楼层大于1时 做冒泡排序            for (int i = 1; i < array.length; i++) {                if (array.length > 1) {                    for (int j = 0; j < array.length - i; j++) {                        if ((Integer) array[j] > (Integer) array[j + 1]) {                            int temp;                            temp = (Integer) array[j];                            array[j] = array[j + 1];                            array[j + 1] = temp;                            LogUtils.e(" array[j]:" + array[j]);                        }                    }                }            }        }        initFloor();    }    @Override    public void onBeaconServiceConnect() {        BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter();        if (blueAdapter == null) {            Toast.makeText(FindShopActivity.this, getString(R.string.map_activity_no_ble), Toast.LENGTH_SHORT).show();        } else if (!blueAdapter.isEnabled()) {            Toast.makeText(FindShopActivity.this, getString(R.string.map_activity_on_ble), Toast.LENGTH_SHORT).show();        } else {            beaconServiceConnected = true;        }    }    @Override    public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {    }    @Override    public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {        if (i == 1000) {            if (geocodeResult != null && geocodeResult.getGeocodeAddressList() != null                    && geocodeResult.getGeocodeAddressList().size() > 0) {//                GeocodeAddress address = geocodeResult.getGeocodeAddressList().get(0);//                endLatitude = address.getLatLonPoint().getLatitude();//                endLongitude = address.getLatLonPoint().getLongitude();//                LatLng latLng = new LatLng(endLatitude, endLongitude);//                mapFragment.easeCameraPosition(latLng, 14);            }        }    }    @Override    public void onLocationChanged(AMapLocation aMapLocation) {        if (aMapLocation != null && !isIndoor) {            curPos[0] = aMapLocation.getLongitude();            curPos[1] = aMapLocation.getLatitude();            curPosFloor = 0;            Log.e("AMapLocation", aMapLocation.toString());            //如果是第一次定位或者两次定位的距离大于20米(默认2秒定位一次)            if (prePos == null || TurfMeasurement.distance(Point.fromCoordinates(curPos), Point.fromCoordinates                    (curPos)) > 0.02) {                mapFragment.updateLocationMarker(Constants.USER_MODE_DRIVING, new LatLng(curPos[1], curPos[0]),                        GMAbstractFragment.locatingDefaultZoom, 0);                prePos = curPos;            }            if (outdoorMapReady) {                shouldSetView = false;            }            if (outdoorMapReady) {                shouldSetView = false;            }        }    }    private class JsInterface {        String jsonData;        String detailData;        Context context;        public JsInterface(Context context) {            this.context = context;        }        @JavascriptInterface        public String getShopsData() {            return jsonData;        }        public void setJsonData(String jsonData) {            this.jsonData = jsonData;        }        @JavascriptInterface        public void showToast(String info) {            Toast.makeText(context, info, Toast.LENGTH_SHORT).show();        }        @JavascriptInterface        public void setDetailData(String detailData) {            this.detailData = detailData;        }        @JavascriptInterface        public String getDetailData() {            return detailData;        }        @JavascriptInterface        public void setCurrentLetter(String currentLetter) {            Toast.makeText(context, currentLetter, Toast.LENGTH_SHORT).show();        }        @JavascriptInterface        public void setSideBarLetter(String[] letters) {            locationSideBar.setLetterList(letters);            locationSideBar.postInvalidate();            shopListWV.reload();        }        @JavascriptInterface        public void displayDetailMapAd(String id, String detail, final String ad) {            //load shop map view            ((FindShopActivity) context).runOnUiThread(new Runnable() {                @Override                public void run() {                    shopListWV.setVisibility(View.GONE);                    locationSideBar.setVisibility(View.GONE);                    canTouchRl.setVisibility(View.GONE);                    shopDetailWv.setVisibility(View.VISIBLE);                    contentContainer.setVisibility(View.VISIBLE);                }            });            GeoNoonClient.getService().getShopById("b001b1ftn7", id).enqueue(new Callback<JsonObject>() {                @Override                public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                    JsonObject res = response.body();                    int code = res.get("code").getAsInt();                    if (code == 0) {                        LogUtils.e("res:" + res);//                        double jd = res.get("code").getAsInt();                        JsonArray pArray = response.body().get("data").getAsJsonObject().get("properties")                                .getAsJsonObject().get("p").getAsJsonArray();                        Double pLongitude = pArray.get(0).getAsDouble();                        Double pLatitude = pArray.get(1).getAsDouble();                        curTarget[0] = pLongitude;                        curTarget[1] = pLatitude;                        mapFragment.highlightenArea(response.body().get("data").getAsJsonObject().toString());                        horizontalListView.setVisibility(View.GONE);                        shopListWV.setVisibility(View.GONE);                        locationSideBar.setVisibility(View.GONE);                        canTouchRl.setVisibility(View.GONE);                        contentContainer.setVisibility(View.VISIBLE);                        fsTxtMap.setSelected(true);                        fsTxtAll.setSelected(false);                    }                }                @Override                public void onFailure(Call<JsonObject> call, Throwable t) {                }            });            //load ship detail view            setDetailData(detail);            shopDetailWv.post(new Runnable() {                @Override                public void run() {                    shopDetailWv.loadUrl(shopDetailUrl);                }            });            //load shop ad view            shopAdWV.post(new Runnable() {                @Override                public void run() {                    shopAdWV.loadUrl(ad);                }            });        }    }    private void initLeftList() {        mList.clear();        Set<String> set = typeMap.keySet();        leftListArray = set.toArray();        LogUtils.e("leftListArray.size:" + leftListArray.length);        for (int i = 0; i < leftListArray.length; i++) {            AreaType areaType = new AreaType(leftListArray[i].toString(), switchType2Des(leftListArray[i].toString()));            mList.add(areaType);        }        updateUI();    }    private String switchType2Des(String s) {        String desc = "";        switch (s) {            case "01":                desc = "汽车";                break;            case "06":                desc = "购物";                break;            case "05":                desc = "餐饮";                break;            case "07":                desc = "生活";                break;            case "08":                desc = "体育休闲";                break;            case "09":                desc = "医疗保健";                break;            case "14":                desc = "科教文化";                break;            case "15":                desc = "交通设施";                break;            case "16":                desc = "金融保险";                break;            case "98":                desc = "公共设施";                break;            default:                desc = "还未命名";                LogUtils.e("s:" + s);                break;        }        return desc;    }    @Override    protected void onResume() {        super.onResume();    }    @OnClick({R.id.fs_txt_map, R.id.fs_txt_all, R.id.fs_citys})    public void onViewClicked(View view) {        contentContainer.setVisibility(View.GONE);        Intent intent;        switch (view.getId()) {            case R.id.fs_txt_map:                clickMap();                switchToIndoor();                startNavigation();                break;            case R.id.fs_txt_all:                clickAll();                break;            case R.id.fs_citys:                intent = new Intent(FindShopActivity.this, UniversalSearchActivity.class);                //发送请求代码REQUEST_UNIVERSAL                startActivityForResult(intent, SysConfig.REQUEST_UNIVERSAL);                break;        }    }    private void clickAll() {        fsTxtAll.setSelected(true);        fsTxtMap.setSelected(false);        contentContainer.setVisibility(View.GONE);        shopListWV.setVisibility(View.VISIBLE);        locationSideBar.setVisibility(View.VISIBLE);        canTouchRl.setVisibility(View.VISIBLE);        clickList = false;        allClick = true;        mapClick = false;        getFloorsAndTypesByBuilding(buildingId);        showShopByBuilding();        horizontalListView.setVisibility(View.VISIBLE);        shopDetailWv.setVisibility(View.GONE);    }    private void clickMap() {        fsTxtMap.setSelected(true);        fsTxtAll.setSelected(false);        contentContainer.setVisibility(View.VISIBLE);        shopListWV.setVisibility(View.GONE);        locationSideBar.setVisibility(View.GONE);        shopDetailWv.setVisibility(View.GONE);        allClick = false;        mapClick = true;        horizontalListView.setVisibility(View.GONE);    }    public void initGeonoonMap(String buildingId) {        GMIndoorOptions options = new GMIndoorOptions.Builder(buildingId)                .mode(GMAbstractFragment.GM_INDOOR)                .floor((short) 1)                .floorFixed(false)                .build();        //创建fragment        final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();//            mapFragment = geonoonMap.getGeonoonMapFragment();        mapFragment = GMAbstractFragment.newInstance(options);        mapFragment.getMapAsync(new OnMapReadyCallback() {            @Override            public void onMapReady(final MapboxMap map) {                theMap = map;            }        });        //是否已存在地图fragment        if (getSupportFragmentManager().findFragmentByTag(MAPFRAGMENT_TAG) == null) {            //添加fragment到容器            transaction.add(R.id.contentContainer, mapFragment, MAPFRAGMENT_TAG);            transaction.commit();        } else {            //替换已有的fragment            transaction.replace(R.id.contentContainer, mapFragment, MAPFRAGMENT_TAG);        }    }    private TextView oldView = null;    private TextView firstTxt = null;    private void updateUI() {        if (mList.size() <= 0) {            if (mAdapter != null) {                mAdapter.updateListView(mList);            }        } else {//            layoutNoCard.setVisibility(View.GONE);            if (mAdapter == null) {                mAdapter = new CustomAdapter<AreaType>(FindShopActivity.this, mList, R.layout.item_findshop) {                    @Override                    public void convert(ViewHolder holder, final AreaType areaType, int position) {                        holder.setText(R.id.item_fs_txt, areaType.getDesc());                        final TextView txt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);                        if (position == 0) {                            firstTxt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);                        }                        if (firstTxt != null) {//                            firstTxt.setTextColor(getResources().getColor(R.color.radioBtnBlue));                            if ((!clickList && allClick)) {                                firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                                LogUtils.e("radioBtnGray");                            }                        }                        holder.getView(R.id.item_fs_ll).setOnClickListener(new View.OnClickListener() {                            @Override                            public void onClick(View v) {                                currentType = areaType.getType();                                clickList();                                if (oldView == null) {//                                    if (firstTxt != null) {//                                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));//                                    }                                    //第一次点击                                    oldView = txt;                                    txt.setTextColor(mContext.getResources().getColor(R.color.searchBgBlue));                                } else {                                    //非第一次点击                                    //把上一次点击的 变化                                    if (firstTxt != null) {                                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                                    }                                    oldView.setTextColor(mContext.getResources().getColor(R.color.radioBtnGray));                                    txt.setTextColor(mContext.getResources().getColor(R.color.searchBgBlue));                                    //保存oldView                                    oldView = txt;                                }                            }                        });                    }                };                if (listView != null) {                    listView.setAdapter(mAdapter);                }            } else {                oldView.setTextColor(getResources().getColor(R.color.radioBtnGray));                if (firstTxt != null) {                    firstTxt.setTextColor(getResources().getColor(R.color.radioBtnBlue));                    LogUtils.e("radioBtnBlue");                    LogUtils.e("firstTxt:" + firstTxt.getText().toString());                    if ((!clickList && allClick)) {                        firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));                        LogUtils.e("radioBtnGray");                    }                }                boolean goNext = false;                if (!firstClickAll && clickList && horizontalClick) {                    newList.clear();                    if (!goNext) {                        for (int i = 0; i < mList.size(); i++) {                            if ((mList.get(i).getType()).equals(currentType)) {                                newList.add(mList.get(i));                            }                        }                        goNext = true;                    }                    if (goNext) {                        for (int i = 0; i < mList.size(); i++) {                            if (!(mList.get(i).getType()).equals(currentType)) {                                newList.add(mList.get(i));                            }                        }                    }                    mAdapter.updateListView(newList);                } else {                    mAdapter.updateListView(mList);                }            }        }    }    private void clickList() {        if (firstClickAll) {            firstClickAll = false;        }        fsTxtMap.setSelected(false);        fsTxtAll.setSelected(false);        contentContainer.setVisibility(View.GONE);        shopListWV.setVisibility(View.VISIBLE);        canTouchRl.setVisibility(View.VISIBLE);        locationSideBar.setVisibility(View.VISIBLE);        shopDetailWv.setVisibility(View.GONE);        clickList = true;        allClick = true;        mapClick = false;        horizontalListView.setVisibility(View.VISIBLE);        showShopsByType(currentType);    }    //根据建筑id获取建筑所有楼层和类别    private void getFloorsAndTypesByBuilding(String buildingId) {        Call<JsonObject> call = GeoNoonClient.getService().getFloorsAndTypesByBuilding(buildingId);        call.enqueue(new Callback<JsonObject>() {            @Override            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                mList.clear();                JsonObject res = response.body();                int code = res.get("code").getAsInt();                if (code == 0) {                    JsonObject resObj = res.get("data").getAsJsonObject();                    floors = resObj.get("floors").getAsJsonArray();                    JsonArray types = resObj.get("types").getAsJsonArray();                    for (int i = 0; i < types.size(); i++) {                        JsonObject shopTypeObj = types.get(i).getAsJsonObject();                        String type = shopTypeObj.get("type").getAsString(), desc = shopTypeObj.get("desc")                                .getAsString();                        shopTypes.put(type, desc);                        AreaType areaType = new AreaType(type, desc);                        mList.add(areaType);                    }                    updateUI();                }            }            @Override            public void onFailure(Call<JsonObject> call, Throwable t) {                t.printStackTrace();            }        });    }    //根据类别显示商铺    private void showShopsByType(String type) {        GeoNoonClient.getService().getShopsByType("b001b1ftn7", type).enqueue(new Callback<JsonObject>() {            @Override            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                if (response.body().get("code").getAsInt() == 0) {                    jsInterface.setJsonData(response.body().get("data").getAsJsonArray().toString());                    shopListWV.loadUrl(baseShopListUrl);                    EditText focusView = null;                    String error = "";                    floorMap.clear();                    try {                        JsonObject res = response.body();                        LogUtils.e("res:" + res);                        int code = res.get("code").getAsInt();                        if (code == 0) {                            JsonArray shops = res.get("data").getAsJsonArray();                            for (int i = 0; i < shops.size(); i++) {                                JsonObject shop = shops.get(i).getAsJsonObject();                                int floor = shop.get("floor").getAsInt();                                if (!floorMap.containsKey(floor)) {                                    floorMap.put(floor, new ArrayList<JsonObject>());                                }//                            floorMap.get(1)                                floorMap.get(floor).add(shop);                            }                            LogUtils.e("floorMap:" + floorMap.keySet());                            initDemoData();                        }                    } catch (Exception e) {                        e.printStackTrace();                        Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                    } finally {//                    showProgress(false);                        if (focusView != null) {                            focusView.setError(error);                            focusView.requestFocus();                        }                    }                }            }            @Override            public void onFailure(Call<JsonObject> call, Throwable t) {            }        });    }    //室内导航调用方法    public void startIndoorLocating() {        posManager = new PosManager();        shouldSetView = true;        if (UserMode == Constants.USER_MODE_WALKING) {            Locator.Callback callback = new Locator.Callback() {                @Override                public void onResult(final JsonObject res) {                    int code = res.get("code").getAsInt();                    if (code == 0) {                        JsonObject data = res.get("data").getAsJsonObject();                        curPosFloor = data.get("f").getAsInt();                        curPos[0] = data.get("lon").getAsDouble();                        curPos[1] = data.get("lat").getAsDouble();                        angleNorth = data.get("ang").getAsFloat();                        //get instructions                        drawCurLocationMarker(true);                    } else {                        Toast.makeText(FindShopActivity.this, "定位失败", Toast.LENGTH_SHORT).show();                    }                }            };            VehicleLocator vehicleLocator = new OnlineVehicleLocator();            vehicleLocator.getPosition(UserConfig.getCurPlate(), callback);        } else {            //initialDialog.show();            posManager.resetPos();            startBleScan();            sdh.start();        }    }    //路径导航    public void startNavigation() {        if (curPos[0] != 0 && curPos[1] != 0) {            if (curTarget[0] != 0 && curTarget[1] != 0) {                final Routing.Callback callback = new Routing.Callback() {                    @Override                    public void onResult(final Route route) {                        runOnUiThread(new Runnable() {                            @Override                            public void run() {                                mapFragment.setRouteSource(route.getFeatureCollection());                                mapFragment.refresh();                            }                        });                    }                };                //起始点位置信息类(lng,lat,floor)//                IndoorPoi start = new IndoorPoi(curPos[0], curPos[1], (byte) curPosFloor);//                IndoorPoi end = new IndoorPoi(curTarget[0], curTarget[1], (byte) curTargetFloor);                IndoorPoi start = new IndoorPoi(curPos[0], curPos[1], (byte) -2);                IndoorPoi end = new IndoorPoi(curTarget[0], curTarget[1], (byte) 2);                String buildingId = SysConfig.curBuilding.bd_id;                Routing routing;                //拓扑图管理(加载数据以及图相关操作)                GraphManager gm = mapFragment.getGraphManager();                if (!gm.hasOfflineData) {                    //在线路径规划测试                    routing = new RoutingOnline();                    routing.getIndoorRoute(buildingId, start, end, callback);                } else {                    //路径规划选项(设置为车辆导航方式,默认为行人导航)                    RoutingOption ro = new RoutingOption(                            (UserMode == Constants.USER_MODE_DRIVING) ?                                    ConstantParams.VEHICLE_CAR :                                    ConstantParams.VEHICLE_FOOT);                    //路径规划算法(默认双向dijkstra算法)                    routing = new RoutingDijkstraBi(gm, ro);                    routing.getIndoorRoute(buildingId, start, end, callback);                }            } else {                Toast.makeText(FindShopActivity.this, "请选择目标位置!", Toast.LENGTH_SHORT).show();            }        } else {            Toast.makeText(FindShopActivity.this, "未定位当前位置!", Toast.LENGTH_SHORT).show();        }    }    @Override    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {        //更新当前扫描轮次        scanRound++;        //判断行人状态,如果在最近扫描周期内走两步以上,则认为在步行        if (stepCount >= 2) {            humanStatus = Constants.HUMAN_STATUS_WALKING;        } else {            humanStatus = Constants.HUMAN_STATUS_STATIC;            scanRoundStatic++;            //如果静止轮次在三轮以上,相当于静止站立六秒,则认为在长静止            if (scanRoundStatic > 3) {                humanStatus = Constants.HUMAN_STATUS_DEEP_STATIC;                posManager.resetPos();            }        }        stepCount = 0;        //步行状态与静止状态使用不同的arma参数,保证步行时定位更新更及时,静止时定位结果更稳定        double armaSpeed = (humanStatus == Constants.HUMAN_STATUS_WALKING) ? SysConfig.armaSpeedWalking : SysConfig                .armaSpeedStatic;        for (Beacon bo : beacons) {            int key = bo.getId3().toInt();            GnBeacon temp = cachedBeacons.get(key);            if (temp == null) {                temp = new GnBeacon();                temp.id = key;            }            temp.updateRound = scanRound;            temp.updateCount++;            temp.rssi = bo.getRssi();            //分别计算平均rssi以及arma滤波后rssi            temp.sumRssi += temp.rssi;            temp.aveRssi = temp.sumRssi / temp.updateCount;            if (temp.armaRssi != 0) {                temp.armaRssi = (int) ((1 - armaSpeed) * temp.armaRssi + armaSpeed * temp.rssi);            } else {                temp.armaRssi = temp.rssi;            }            cachedBeacons.put(key, temp);        }        positioning();    }    private void positioning() {        // build feature string        StringBuilder featureSb = new StringBuilder();        for (Map.Entry<Integer, GnBeacon> entry : cachedBeacons.entrySet()) {            GnBeacon bo = entry.getValue();            if (scanRound - bo.updateRound <= SysConfig.scanRoundTolerance) {                featureSb.append(entry.getKey()).append(":").append(bo.armaRssi).append(",");            }        }        String feature = ""; //featureSb.toString();        /*if (feature.length() <= 1) {            return;        }        feature = feature.substring(0, feature.length() - 1);*/        //feature = "34503:-93,34554:-92,35468:-93,50437:-89,50489:-90,50495:-72,50873:-89,51656:-98,51724:-88,        // 52257:-95";        feature = "32036:-93,32137:-75,33020:-91,33021:-97,33292:-94,34549:-95,34592:-95,34663:-95,34767:-91," +                "34820:-96,34898:-86,34970:-91,35025:-95,35031:-97,35112:-92,35115:-99,35125:-95,35143:-92,35147:-94," +                "35155:-90,35435:-94,35445:-88,35448:-92,35470:-96,35557:-91,35610:-92,36094:-93,36104:-97,36109:-95," +                "36112:-96,36115:-92,36116:-92,36187:-79,36216:-79,36218:-97,36219:-90,36262:-95,36268:-93,36279:-97," +                "36321:-98,37695:-91,37697:-97,37722:-95,37753:-97,37772:-72,42912:-94,43280:-95,44626:-97,46235:-99," +                "46854:-98,48103:-99,48192:-95,49467:-91,49520:-81,49973:-93,50073:-94,50086:-84,50087:-96,50124:-98," +                "50207:-93,50208:-98,50217:-95,50275:-95,50429:-94,50446:-95,50449:-91,50523:-92,50528:-95,50530:-72," +                "50551:-97,50555:-93,50602:-97,50637:-102,50699:-96,50802:-89,50896:-72,51139:-101,51608:-98," +                "51626:-90,51702:-89,51711:-91,51772:-96,51904:-80,51905:-98,51993:-99,52015:-94,52023:-90,52032:-87," +                "52033:-99,52035:-92,52038:-88,52045:-92,52051:-89,52061:-93,52063:-93,52070:-94,52084:-92,52356:-97," +                "52371:-94,52610:-93,52613:-88";        Locator.Callback callback = new Locator.Callback() {            @Override            public void onResult(final JsonObject res) {                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        updatePos(res);                    }                });            }        };        pedestrianLocator pedestrianLocator;        if (SysConfig.offlineFeature != null) {            pedestrianLocator = new OfflinePedestrianLocator();        } else {            pedestrianLocator = new OnlinePedestrianLocator();        }        pedestrianLocator.getPosition(feature, posManager.getPdrPos()[0], posManager.getPdrPos()[1], callback);    }    private void drawCurLocationMarker(boolean setView) {        if (curPos[0] != 0 && curPos[1] != 0) {            mapFragment.updateLocationMarker((byte) UserMode, new LatLng(curPos[1], curPos[0]), mapFragment                    .getCurrentZoom(), angleNorth);            if (setView) {                if (isIndoor) {                    mapFragment.setFloor((short) curPosFloor);                } else {                    theMap.moveCamera(CameraUpdateFactory.zoomTo(15));                }                theMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(curPos[1], curPos[0])));            }        }    }    /*更新位置信息*/    private void updatePos(JsonObject res) {        int code = res.get("code").getAsInt();        if (code == 0) {            Toast.makeText(FindShopActivity.this, res.get("cos").getAsString(), Toast.LENGTH_SHORT).show();            curPosFloor = res.get("floor").getAsInt();            JsonArray c = res.get("coordinate").getAsJsonArray();            boolean isFirstSet = posManager.setBlePos(c.get(0).getAsDouble(), c.get(1).getAsDouble());            boolean jump = res.get("jump").getAsBoolean();            //在用户长静止后,或者服务器返回需要jump,则将pdr位置重置为当前蓝牙定位位置            if (humanStatus == Constants.HUMAN_STATUS_DEEP_STATIC || jump) {                //initialDialog.dismiss();                posManager.correctPdrPos();            }            if (posManager.isCorrected())                pointStatus = Constants.POINT_STATUS_FOLLOW;            if (posManager.isBlePosChanged()) {                if (isFirstSet) {                    //autoZoom();                    curPos = posManager.getBlePos().clone();                    drawCurLocationMarker(shouldSetView);                    shouldSetView = false;                } else {                    pointStatus = Constants.POINT_STATUS_ANIMATION;                    drawCurLocationMarkerAnimation(posManager.getBlePos());                }            }        } else {            Toast.makeText(FindShopActivity.this, "定位失败", Toast.LENGTH_SHORT).show();        }    }    private void drawCurLocationMarkerAnimation(double[] end) {        curFrame = 0;        deltaLen[0] = (end[0] - curPos[0]) / frameCount;        deltaLen[1] = (end[1] - curPos[1]) / frameCount;        handler.postDelayed(runnable, 0);    }    public void startBleScan() {        try {            mBeaconManager.startRangingBeaconsInRegion(region);        } catch (RemoteException e) {            e.printStackTrace();        }    }    GeocodeSearch geocodeSearch;    /*初始化蓝牙及定位信息*/    private void initManager() {        geocodeSearch = new GeocodeSearch(this);        geocodeSearch.setOnGeocodeSearchListener(this);        mBeaconManager = BeaconManager.getInstanceForApplication(FindShopActivity.this);        mBeaconManager.setAndroidLScanningDisabled(true);        mBeaconManager.setForegroundScanPeriod(SysConfig.ScanPeriod);        mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(SysConfig.iBeaconParser));        SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);        orh = new OrientationHandler(sm, mOrientationListener);        sdh = new StepDetectionHandler(sm, mStepDetectionListener);        posManager = new PosManager();        if (mLocationClient == null) {            mLocationClient = new AMapLocationClient(this);            mLocationOption = new AMapLocationClientOption();            mLocationClient.setLocationListener(this);            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);            mLocationClient.setLocationOption(mLocationOption);        }    }    private void handleAnimation(final View bar, final FoldingLayout foldingLayout, View parent, final View            nextParent) {        final ImageView arrow = (ImageView) parent.findViewWithTag(TAG_ARROW);        foldingLayout.setFoldListener(new OnFoldListener() {            @Override            public void onStartFold(float foldFactor) {                bar.setClickable(true);                arrow.setBackgroundResource(R.drawable.fs_arrow_up);                resetMarginToTop(foldingLayout, foldFactor, nextParent);            }            @Override            public void onFoldingState(float foldFactor, float foldDrawHeight) {                bar.setClickable(false);                resetMarginToTop(foldingLayout, foldFactor, nextParent);            }            @Override            public void onEndFold(float foldFactor) {                bar.setClickable(true);                arrow.setBackgroundResource(R.drawable.fs_arrow_down);                resetMarginToTop(foldingLayout, foldFactor, nextParent);            }        });        animateFold(foldingLayout, 300);    }    private void setMarginToTop(float foldFactor, View nextParent) {        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) nextParent.getLayoutParams();        lp.topMargin = (int) (-dp2px(FindShopActivity.this, 135) * foldFactor) + dp2px(FindShopActivity.this, 10);        nextParent.setLayoutParams(lp);    }    private void resetMarginToTop(View view, float foldFactor, View nextParent) {        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) nextParent.getLayoutParams();        lp.topMargin = (int) (-view.getMeasuredHeight() * foldFactor) + dp2px(FindShopActivity.this, 10);        nextParent.setLayoutParams(lp);    }    public void animateFold(FoldingLayout foldLayout, int duration) {        float foldFactor = foldLayout.getFoldFactor();        ObjectAnimator animator = ObjectAnimator.ofFloat(foldLayout,                "foldFactor", foldFactor, foldFactor > 0 ? 0 : 1);        animator.setRepeatMode(ValueAnimator.REVERSE);        animator.setRepeatCount(0);        animator.setDuration(duration);        animator.setInterpolator(new AccelerateInterpolator());        animator.start();    }    public final static int dp2px(Context context, float dpValue) {        float density = context.getResources().getDisplayMetrics().density;        return (int) (dpValue * density + 0.5f);    }    private void getOutBuildings() {        new Thread(new Runnable() {            @Override            public void run() {                Call<JsonObject> call = GeoNoonClient.getService().getBuildingsByCity("027");                call.enqueue(new Callback<JsonObject>() {                    @Override                    public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {                        try {                            JsonObject res = response.body();                            int code = res.get("code").getAsInt();                            if (code == 0) {                                buildings = res.get("data").getAsJsonArray();                            }                        } catch (Exception e) {                            e.printStackTrace();                            Toast.makeText(FindShopActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                        }                    }                    @Override                    public void onFailure(Call<JsonObject> call, Throwable t) {                        t.printStackTrace();                        Toast.makeText(FindShopActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();                    }                });            }        }).start();    }    public void switchToIndoor() {        for (int i = 0; i < buildings.size(); i++) {            if (buildings.get(i).getAsJsonObject().get("bd_id").getAsString().equals("b001b1ftn7")) {                SysConfig.setBuilding(buildings.get(i).toString());                break;            }        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        //先判断是哪个页面返回过来的        switch (requestCode) {            case SysConfig.REQUEST_UNIVERSAL:                //再判断返回过来的情况,是成功还是失败还是其它的什么……                switch (resultCode) {                    case SysConfig.RESULT_UNIVERSAL:                        Bundle b = data.getExtras(); //data为B中回传的Intent                        String name = b.getString("name");//str即为回传的值                        fsCitys.setText(name);                        break;                }                break;        }    }}

关于HorizantalListView的颜色变化,亲测drawable里d selector没问题,如果大家有需要的话也会把HorizantalListView的代码双手奉上。
其实内容点还包括右侧栏的首字母搜索啊,交叉排序啊,这里我也不着重讲了
第一次发博,大神轻喷,希望能帮助到需要的人~

阅读全文
2 0
原创粉丝点击