- (NSMutableArray *)compareList:(NSMutableArray *)list IS_UP:(BOOL)isUp IS_PRICE:(BOOL)isPrice
{
NSMutableArray *finalList = [[[NSMutableArray alloc] init] autorelease];
if (isPrice == YES) {
NSMutableArray *RecommandCloth_list = [[NSMutableArray alloc] initWithArray:list];
int count = RecommandCloth_list.count;
NSLog(@"count:%d",count);
RecommandClothItem * tempRecommand_small;
RecommandClothItem * tempRecommand;
while (RecommandCloth_list.count > 0) {
tempRecommand_small = [RecommandCloth_list objectAtIndex:0];
for (int i=1; i<RecommandCloth_list.count; i++) {
tempRecommand = [RecommandCloth_list objectAtIndex:i];
NSLog(@"tempRecommand.price:%@",tempRecommand.price);
NSLog(@"tempRecommand_small.price:%@",tempRecommand_small.price);
if (isUp == YES) {
if (tempRecommand.price.intValue < tempRecommand_small.price.intValue) {
tempRecommand_small = tempRecommand;
}
}
else {
if (tempRecommand.price.intValue > tempRecommand_small.price.intValue) {
tempRecommand_small = tempRecommand;
}
}
}
[finalList addObject:tempRecommand_small];
for (int j = 0; j<RecommandCloth_list.count;j++) {
RecommandClothItem *temp_RecommandClothItem = [RecommandCloth_list objectAtIndex:j];
if ([tempRecommand_small.recommandCloth_id isEqualToString:temp_RecommandClothItem.recommandCloth_id]) {
[RecommandCloth_list removeObject:temp_RecommandClothItem];
}
}
NSLog(@"RecommandCloth_list.count:%d",RecommandCloth_list.count);
}
}
else{
NSMutableArray *RecommandCloth_list = [[NSMutableArray alloc] initWithArray:list];
int count = RecommandCloth_list.count;
NSLog(@"count:%d",count);
RecommandClothItem * tempRecommand_small;
RecommandClothItem * tempRecommand;
while (RecommandCloth_list.count > 0) {
tempRecommand_small = [RecommandCloth_list objectAtIndex:0];
for (int i=1; i<RecommandCloth_list.count; i++) {
tempRecommand = [RecommandCloth_list objectAtIndex:i];
NSLog(@"tempRecommand.price:%@",tempRecommand.price);
NSLog(@"tempRecommand_small.price:%@",tempRecommand_small.price);
if (isUp == YES) {
if (tempRecommand.sales_volume.intValue < tempRecommand_small.sales_volume.intValue) {
tempRecommand_small = tempRecommand;
}
}
else {
if (tempRecommand.sales_volume.intValue > tempRecommand_small.sales_volume.intValue) {
tempRecommand_small = tempRecommand;
}
}
}
[finalList addObject:tempRecommand_small];
for (int j = 0; j<RecommandCloth_list.count;j++) {
RecommandClothItem *temp_RecommandClothItem = [RecommandCloth_list objectAtIndex:j];
if ([tempRecommand_small.recommandCloth_id isEqualToString:temp_RecommandClothItem.recommandCloth_id]) {
[RecommandCloth_list removeObject:temp_RecommandClothItem];
}
}
NSLog(@"RecommandCloth_list.count:%d",RecommandCloth_list.count);
}
}
return finalList;
}
黑帽安全技术大会是世界上最好的能够了解未来安全趋势的信息峰会。 专业的黑客、极客,安全防范公司研究人员,政府部门的代表,IT新闻记者,几乎每个到场的人会不由自主的把自己当成一名专业的黑客。而每次的黑帽大会上,总是会爆出一些让人意想不到的新闻消息出来。
这次就有消息表明,在下周举办的黑帽大会以及EFCON安全会议上,无人间谍机WASP就有可能能为这次会议的焦点。
WASP由前美国军方无人飞机Measuirng改造而成,用途只有一个,就是作为无线网络的空中监视平台来大规模破解Wifi以及GSM网络,WASP就如同它本身的名字WASP所表述的那样,就是一个在空中四处窥探的大黄蜂,通身泛黄。所以哪天你要是看到一架奇怪的黄色无人飞机在你家上空来回盘旋,那么恭喜你,“ The Big brother is watching you”。
WASP通过机载嵌入式的威盛EPIA Pico-ITX电脑,on-board VIA EPIA Pico-ITX PCBackTrack linux系统(PS:BackTrack是一套专业的计算机安全检测的Linux操作系统,专门用来破解WEP,WPA/WPA2等Wifi加密方式以及其它网络环境),自备32GB存储空间。
除了破解Wifi网络之外,WASP还施展偷天换日之术,充当GSM网络天线,从而达到窃听连接网络的手机呼叫和短消息的目的,与此同时,飞机上配备的高清摄像机还可以从高空对想要窥探的地点进行目标的高清视频捕获。
虽然这种玩意张牙舞爪的漫天到处乱飞窥探机密,可能违反了相关的飞行律法,但是并不违反FCC(美国联邦通讯委员会)相关条例,而且这飞机也是美国两个闲着无聊的家伙在课余时间搞出来的。所以,这个项目是可以进行交易与对外贩卖的。有钱多金的公子哥们,还在用那些老式的电话窃听的方式来窃听商业竞争对手或者情人的电话内容嘛?不考虑搞一台这个来吗,给你一个让你重新认识另一个不一样的“TA”的机会。 这里有相关试飞视频,以供读者一
1. 简单的代码
1. public static final int ITEM_1_ID = Menu.FIRST;
2. public static final int ITEM_2_ID = Menu.FIRST + 1;
3. public static final int ITEM_3_ID = Menu.FIRST + 2;
4.
5. public boolean onCreateOptionsMenu(Menu menu) {
6. super.onCreateOptionsMenu(menu);
7. //不带图标的menu
8. menu.add(0, ITEM_1_ID, 0, "item-1");
9. //带图标的menu
10. menu.add(0, ITEM_2_ID, 1, "item-2").setIcon(R.drawable.editbills2);
11. menu.add(0, ITEM_3_ID, 2, "item-3").setIcon(R.drawable.billsum1);
12. return true;
13. }
14.
15. public boolean onOptionsItemSelected(MenuItem item){
16. switch (item.getItemId()) {
17. case 1:
18. Toast.makeText(this, "menu1",Toast.LENGTH_SHORT).show();
19. return true;
20. case 2:
21.
22. return true;
23. case 3:
24.
25. return true;
26. }
27. return false;
28. }
2. menu实现的两种方法大部分的应用程序都包括两种人机互动方式,一种是直接通过GUI的 Views,其可以满足大部分的交互操作。另外一种是应用Menu,当按下Menu按钮后,会弹出与当前活动状态下的应用程序相匹配的菜单。
这两种方式相比较都有各自的优势,而且可以很好的相辅相成,即便用户可以由主界面完成大部分操作,但是适当的拓展Menu功能可以更加完善应用程序,至少用户可以通过排列整齐的 按钮清晰的了解当前模式下可以使用的功能。
有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:
第一种方法,通过Layout来添加静态菜单元素。
一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Eclipse创建一个新项目后,可以看到res/layout中存在一个 预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式 创建一个静态的Menu,创建方法参阅下边的源代码:
?View Code XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/previous"
android:title="@string/previous"
android:enabled="false"
android:icon="@android:drawable/ic_media_previous"/>
<!--these may not be available in next api (level > 3), so be carefull-->
<item
android:id="@+id/play_pause"
android:title="@string/play"
android:icon="@android:drawable/ic_media_play"/>
<item
android:id="@+id/next"
android:title="@string/next"
android:icon="@android:drawable/ic_menu_next"/>
</menu>
在Activity类中调用刚刚创建的Menu,首先将当前的Activity与指定的Menu XML相关联:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.layout.menu_mainactivity, menu);
return true;
}
实现onOptionsItemSelected方法: (其目的是捕捉到菜单触发事件后,对具体触发的选项作出响应,实际调用的函数包含在各自的case中)
01.@Override
02.public boolean onOptionsItemSelected(MenuItem item) {
03. switch (item.getItemId()) {
04. case R.id.previous:
05. previous(); //go to previous song in the playlist
06. return true;
07. case R.id.play_pause:
08. isPlaying() ? pause() : play(); //toggle play/pause
09. return true;
10. case R.id.next:
11. next(); //go to next song in the playlist
12. return true;
13. }
14. return false; //should never happen
15.}
最后可以通过onPrepareOptionMenu方法初始化Menu Items的属性:
01.@Override
02.public boolean onPrepareOptionsMenu(Menu menu) {
03. //set play_pause menu item look
04. if(isPlaying()) {
05. menu
06. .findItem(R.id.play_pause)
07. .setTitle(R.string.pause)
08. .setIcon(android.R.drawable.ic_media_pause);
09. } else {
10. menu
11. .findItem(R.id.play_pause)
12. .setTitle(R.string.play)
13. .setIcon(android.R.drawable.ic_media_play);
14. }
15. return true;
16.}
大部分程序都通过这种方式添加Menu菜单功能,而且通过以上的步骤来看,其实现方法非常简单。
第二种方法,在Activity类中动态创建Menu。
首先需要定义Menu Item识别序号:
1.public static final MENU_PREVIOUS = 0; //no more R.ids
2.public static final MENU_PLAY_PAUSE = 1;
3.public static final MENU_NEXT = 2;
实现onCreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)
01.@Override
02.public boolean onCreateOptionsMenu(Menu menu) {
03. menu
04. .add(0, MENU_PREVIOUS, 0, R.string.previous)
05. .setIcon(android.R.drawable.ic_media_previous);
06. menu
07. .add(0, MENU_PLAY_PAUSE, 0, R.string.play)
08. .setIcon (android.R.drawable.ic_media_play);
09. menu
10. .add(0, MENU_NEXT, 0, R.string.next)
11. .setIcon(android.R.drawable.ic_media_next);
12. return true;
13.}
引用与第一种方法相同的方式来捕捉菜单的行为:
01.@Override
02.public boolean onOptionsItemSelected(MenuItem item) {
03. switch (item.getItemId()) {
04. case MENU_PREVIOUS:
05. previous(); //go to previous song in the playlist
06. return true;
07. case MENU_PLAY_PAUSE:
08. isPlaying() ? pause() : play(); //toggle play/pause
09. return true;
10. case MENU_NEXT:
11. next(); //go to next song in the playlist
12. return true;
13. }
14. return false; //should never happen
15.}
————
对以上两种方法的补充:
根据需要设置不同Menu Item的属性:
1.menu.findItem(R.id.next).setEnabled(false);
设置Menu Item从属关系(添加子父级别):
直接写在方法中:
1.menu
2. .addSubMenu(R.id.repeat)
3. .add(R.id.one)
4. .add(R.id.all)
5. .add(R.id.none);
直接定义在XML Layout中:
?View Code XML
<item android:id="@+id/repeat" android:title="@string/repeat">
<menu>
<item android:id="@+id/one" android:title="@string/repeat_one"></item>
<item android:id="@+id/all" android:title="@string/repeat_all"></item>
<item android:id="@+id/none" android:title="@string/repeat_none"></item>
</menu>
————
这两种不同的方法实现的目的是一样的,而且不存在本质上的却别,具体根据实际情况(根据项目的结构需要或者团队开发标准)选择合适的方法来创建Menu。