在ListView的onScroll事件中执行异步加载数据,然后使用notifyDataSetChange()函数更新适配器,之后发现listView不能点击了,这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。
case LOADAPPNEXT: dismissDialog(); this.appLoadingList.addAll((List<AppItemList>) msg.body); onScrolltimes++; runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); listView.requestFocusFromTouch(); } }); showToast(msg.extra); break;
问题最终得到了解决,但是原因本人不是特别清楚,说说本人的拙见,欢迎拍砖!
android系统会对每一个运行的UI线程提供缓存机制,也就是说我们在使用诸如listView这种需要异步更新的控件时候,在notifyDataSetChange()之后,务必要记得唤醒或者说是重置你的onItemClickListener。
问:我手机屏幕左上角显示出五格无线信号(wireless signal bars),代表什么意思?
答:这些信号格的用意,是显示出手机与无线网络连接的能力,这是根据手机收到的无线电信信号有多强而定。这五格测量从无线基站接收信号的分贝(decibels)强度。
问:信号格数的多寡代表什么意义?
答:你的所在位置愈是接近无线塔台,或你从无线塔台收到的信号愈强,你手机上显示的信号强度可能就愈强,也就是格数就愈多。如果信号强度太低,你可能连通话都无法完成,或是接收信号有困难。如果你在这种情况下使用手机,话讲到一半或资料传到半途就中断的可能性会升高。
问:信号格数减少,对使用的是GSM或CDMA手机而言,有差别吗?
答:是有差别。如果是用AT&T和T-Mobile USA采用的GSM技术,信号强度偏低造成问题的机率,会高于使用CDMA的情况。CDMA是Verizon Wireless和Sprint Nextel采用的技术,这种技术在处理与网络连接方面的效率比较高。所以,即使CDMA信号强度偏低,只要不是因为网络拥堵造成的高度杂音,你仍然可以保持良好的连接。
问:什么样的数字,显示信号强度是强的或弱的?
答:通常,分贝数113左右,是在信号的低档区;分贝数50左右,则在高档区(显示出更多的信号格数)。分贝测量数字愈接近零,信号就愈强。
问:苹果表示,很“讶异”地发现自己用来计算该显示多少信号格的公式竟然出错。这是什么意思?
答:有些人可能以为,iPhone信号强度图示上,每一格代表等量的分贝数,但显然不是这样。根据AnandTech网站做的测试,iPhone上的第五格代表40dB,但第四格只代表大约10dB,第三格代表2dB,第二格代表4dB,第一格代表6dB的差距。
问:苹果何不用直线方式来表示,让每一格代表相同的分贝数?
答:因为范围(range)太广大,偏低信号的强度问题难以诊断。信号强度测量在高档区不必分得太细,因为性能只在大幅降低时才受影响。但低档区间就必须分得细一点。
问:有没有统一的标准作法,让手机制造商可用来测量信号强度?
答:令人遗憾的是,目前没有一种测量信号强度的标准作法。
问:有没有比五格图表更精确的信号强度衡量方式?
答:智能手机,例如采用Android软件的手机以及RIM的黑莓机(BlackBerry),也能够以数字型的分贝数来显示信号接收情形,不一定只能以五格图形显示。但AnandTech指出,苹果已删除那项工具。
问:那么,如果手机显示信号是五格全满的,就表示手机运作应该是无懈可击吗?
答:未必是如此。即使信号强度显示是满格的,但若是网络大量拥堵,仍难以维持良好的连接品质。这种状况比较常发生在人口稠密、许多人同时在使用网络的地区,例如大城市里,或是体育赛事举行的地点,诸如此类。
#include <stdio.h> void del_char(char *str, char ch) { char *p1,*p2; p1=p2=str; while(*p2!='\0'){ if(*p2!=ch) p1++; p2++; *p1=*p2; } } void del_same(char *str) { char *p1,*p2; p1=p2=str; while(*p2!='\0'){ if(*(p2+1)!=*p1) p1++; p2++; *p1=*p2; } } int main(int argc, char**argv) { char *str=argv[1]; printf("ORG:%s\n",str); del_char(str,'a'); printf("Del_a:%s\n",str); del_same(str); printf("Del_same:%s\n",str); return 0; }