1、item内如果有button等控件时,在监听listview的onitemclick事件时,焦点会被item内的button、imagebutton等控件抢走,从而导致在listview设置了onitemclick事件后不会被触发。解决方法是在初始化item的时候屏蔽掉其内部button等控件的焦点获取,具体方法可以在自定义item的根控件中调用:
这样就能阻塞字控件抢夺焦点,listview的onitemclick就能被正确触发,同时对item内部的button等控件也没有影响,他们在被点击时照样可以触发自身的点击事件。
2、当listview需要添加headerview时,可以通过调用listview的addHeaderView(headView, null, false) 方法,该方法还有一个重载方法 addHeaderView(headView);这两个方法的区别是前一个方法可以控制header是否可以被selected,如果不想被selected则将第三个参数设置成false;
3、接着上面说的添加header,添加header时调用的addHeaderView方法必须放在listview.setadapter前面,意思很明确就是如果想给listview添加头部则必须在给其绑定adapter前添加,否则会报错。原因是当我们在调用setAdapter方法时会android会判断当前listview是否已经添加header,如果已经添加则会生成一个新的HeaderViewListAdapter,这个新的HeaderViewListAdapter包含我们设置的adapter所有内容以及listview的header和footer。所以当我们在给listview添加了header后在程序中调用listview.getadapter时返回的是tempadapter而不是我们通过setadapter传进去的adapter。如果没有设置adapter则HeaderViewListAdapter与我们自己的adapter是一样的。listview.getadapter().getcount()方法返回值会比我们预期的要大,原因是添加了header。
4、接着上面的HeaderViewListAdapter说,我们自定义adapter里面的getitem方法里面返回的position是不包括header的,是我们自定义adapter中数据position编号从0开始,也就是说与我们传进去的list的位置是一样的。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.i("adapter", "position:"+position); //这个position就是我们数据的真实位置
}
而listview的onitemclick方法中:
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
position是当前click的位置,这个位置是指在HeaderViewListAdapter中的位置,从0开始如果listview中添加了header则0代表header。
首先,Xcode4.5的dmg文件已mount为磁盘驱动器。打开终端窗口,键入“su-”命令,以root身份运行下列命令(或者建立一个shell脚本文件然后运行)。
echo copying iPhoneOS6.0.sdk
cp -R/Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/
echo copying iphonesim6.0.sdk
cp -R/Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/
echo copying devicesupport for 6.0
cp -R/Volumes/Xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/6.0\\(10A403\) /Developer/Platforms/iPhoneOS.platform/DeviceSupport/
#remove old -latest- link
rm -f/Developer/Platforms/iPhoneOS.platform/DeviceSupport/Latest
echo setting up Latest link
cd/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
ln -s ./6.0\ \(10A403\) ./Latest
iPhoneSimulator 6.0模拟器在雪豹系统上运行似乎会有点问题,如果你在编译项目时遇到“Library not loaded: /usr/lib/system/libdispatch.dylib”错误,请删除iPhoneSimulator6.0模拟器。或将脚本中拷贝模拟器的cp命令删除。
这一篇帖子是按照上一篇帖子的逻辑来的,麻烦先看上一篇帖子
《003 走上移动开发之安卓项目实战(百度地图:在地图范围内进行检索与驾车路线搜索)》
如果有什么不懂的请看上一篇帖子
《002 走上移动开发之安卓项目实战(百度地图:给地图添加标注物)》
如果还有什么看不懂的请您先从第一篇文章看起
《001 走上移动开发之安卓项目实战(百度地图:建立百度地图开发环境)》
还请大家注意在文章进行转载的时候麻烦注明出处
《http://blog.csdn.net/shuaiyinoo》谢谢
好了接下来今天给大家带来的是三个技术点,
第一个技术点:行走路线
按照我们以前的经验要实现行走路线的搜索第一步先在 onCreate 方法中加入如下搜索代码
//6.0行走路线的搜索 //mapController.setZoom(12); //在地图范围内实现对物体的搜索 //mkSearch = new MKSearch(); //mkSearch.init(bMapManager, new MySearchListener()); //给定第一个坐标 //start = new MKPlanNode(); //start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)); //给定第二个坐标 //end = new MKPlanNode(); //end.pt = new GeoPoint(40057031,116307852); //设置回调的行走路线的方法 //mkSearch.walkingSearch(null, start, null, end);然后定义一个 MySearchListener implements MKSearchListener 他
实现接口中的 onGetWalkingrouteResult 方法
@Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int type) { //对调用的搜索方法进行回调响应 if(result == null){ return; } RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView); routeOverlay.setData(result.getPlan(0).getRoute(0)); mapView.getOverlays().add(routeOverlay); //刷新地图 mapView.invalidate(); }
第二个技术点:公交换乘路线
同样第一步,第二步的操作
//7.0公交换乘路线的搜索 //mapController.setZoom(12); //在地图范围内实现对物体的搜索 //mkSearch = new MKSearch(); //mkSearch.init(bMapManager, new MySearchListener()); //给定第一个坐标 //start = new MKPlanNode(); //start.pt = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6)); //给定第二个坐标 //end = new MKPlanNode(); //end.pt = new GeoPoint(40057031,116307852); //设置回调的行走路线的方法 //mkSearch.transitSearch("北京", start, end);
@Override public void onGetTransitRouteResult(MKTransitRouteResult result, int type) { //公交换乘的回调方法 if(result == null){ return; } TransitOverlay transitOverlay = new TransitOverlay(BaiDu_SuYiActivity.this, mapView); transitOverlay.setData(result.getPlan(0)); mapView.getOverlays().add(transitOverlay); //刷新地图 mapView.invalidate(); }
第三个技术点:公交详细路线
公交详细路线的搜索相对来说复杂一点点
第一步还是不变
//8.0公交详细路线的搜索 mapController.setZoom(12); //在地图范围内实现对物体的搜索 mkSearch = new MKSearch(); mkSearch.init(bMapManager, new MySearchListener()); //设置回调的行走路线的方法 mkSearch.poiSearchInCity("北京", "300");第二步首先实现接口里面的这个方法
@Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { //对调用的搜索方法进行回调响应 //v8.00 if(result == null||iError != 0){ Toast.makeText(BaiDu_SuYiActivity.this, "对不起,找不到您的结果", 2).show(); return; } //定义一个公交线路图描述类 MKPoiInfo mkPoiInfo = null; //获得公交线路图的总的站点 int totalPoiNum = result.getNumPois(); for(int i = 0;i<totalPoiNum;i++){ mkPoiInfo = result.getPoi(i); if(mkPoiInfo.ePoiType == 2){ break; //如果说返回的时候公交的线路图就返回 } } mkSearch.busLineSearch("北京", mkPoiInfo.uid); }第三步然后再实现里面的下面这个方法
@Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { } @Override public void onGetBusDetailResult(MKBusLineResult result, int type) { if(result == null||type != 0){ Toast.makeText(BaiDu_SuYiActivity.this, "对不起,找不到您的结果", 2).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(BaiDu_SuYiActivity.this, mapView); routeOverlay.setData(result.getBusRoute()); //清空所有的公交信息 mapView.getOverlays().clear(); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); mapView.getController().animateTo(result.getBusRoute().getStart()); }
这样这三个知识点就算完成了。