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的代码双手奉上。
其实内容点还包括右侧栏的首字母搜索啊,交叉排序啊,这里我也不着重讲了
第一次发博,大神轻喷,希望能帮助到需要的人~
- listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序
- ListView item被选中时颜色的变化
- 改变选中的ListView Item数据颜色直到选中下一个
- Listview的item选中时的背景色的变化
- 【Android】Listview可以选择多行,点击选中行item字体颜色变化
- ListView中item点击的时候颜色变化
- ListView Item 选中时 改变 TextView 的字体颜色
- 改变listview中item选中时文字的颜色
- 改变listview中item选中时文字的颜色
- 改变listview中item选中时文字的颜色
- Android的ListView子Item选中改变TextView字体颜色
- listview选中项item颜色改变
- 删除ListView选中的item
- 选择ListView的某个item显示选中状态
- 可以选择item的listview
- android中设置ListView的选中的Item的背景颜色(松开后的背景颜色)
- ListView的item选中后保持选中时的高亮颜色。
- ListView点击item改变背景,重新选中另一项刷新,默认是选中第一项的状态
- 守护进程
- 播放视频
- hadoop3.0 分布式搭建/安装
- mysql三种复制的优缺点
- mongodb设置用户名密码,以及权限
- listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序
- 深入理解java异常处理机制
- Git 提交代码到github
- ROW_NUMBER() OVER函数的基本用法 / Rank() over()的用法
- hdu 5869 求区间不同gcd数 离线+树状数组+rmq二分
- Redis安装
- $* $@
- Linux版Oracle数据库的基本操作
- VMware下桥接设置