自开始学习Android以来,我遇到了一个问题。
我有以下代码,当我的ListView中的项目较少时,它可以正常工作:
for (int i = 0; i < listView.getCount(); i++) {
v = listView.getAdapter().getView(i, null, null);
txt_flag = (TextView) v.findViewById(R.id.txt_flag);
flag = txt_flag.getText().toString();
txt_catid = (TextView) v.findViewById(R.id.txt_catid);
catid = Integer.parseInt(txt_catid.getText().toString());
img_catdes = (ImageView) listView.getChildAt(i).findViewById(R.id.img_catdes);
if(categoryid == 1){
img_catdes.setImageResource(R.drawable.category_personal1);
}
else if(categoryid == 2){
img_catdes.setImageResource(R.drawable.category_personal2);
}
if ("2".equals(flag)){
chk_flag = (CheckBox) listView.getChildAt(i).findViewById(R.id.checkBox_completed);
chk_flag.setChecked(true);
}
}
但是,当ListView变得更长或更具体而言,当ListView项目在屏幕上不再可见时,我总是会遇到崩溃!
我非常确定设置ImageView资源和设置CheckBox状态的行是引起问题的那一行,因为注释该块时不再遇到该错误。
请帮助大家,因为这使我晚上难以入睡。 :-(
提前致谢。
LogCat:
11-08 15:16:03.450:D / AbsListView(5306):调用unregisterIRListener()
11-08 15:16:03.470:D / AbsListView(5306):调用unregisterIRListener()
11-08 15:16:03.590:D / dalvikvm(5306):GC_CONCURRENT释放了194K,25%释放了8095K / 10684K,暂停了3ms + 10ms,总计30ms
11-08 15:16:03.640:D / AndroidRuntime(5306):关闭VM
11-08 15:16:03.640:W / dalvikvm(5306):threadid = 1:线程以未捕获的异常退出(group = 0x41c50930)
11-08 15:16:03.640:E / AndroidRuntime(5306):致命异常:主
11-08 15:16:03.640:E / AndroidRuntime(5306):java.lang.IllegalStateException:无法执行活动的方法
11-08 15:16:03.640:E / AndroidRuntime(5306):在android.view.View $ 1.onClick(View.java:3758)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.view.View.performClick(View.java:4377)
11-08 15:16:03.640:E / AndroidRuntime(5306):at pkg.robearthsoftworks.Main.onWindowFocusChanged(Main.java:89)
11-08 15:16:03.640:E / AndroidRuntime(5306):在com.android.internal.policy.impl.PhoneWindow $ DecorView.onWindowFocusChanged(PhoneWindow.java:2825)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.view.View.dispatchWindowFocusChanged(View.java:7679)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:971)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.view.ViewRootImpl $ ViewRootHandler.handleMessage(ViewRootImpl.java:3328)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.os.Handler.dispatchMessage(Handler.java:99)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.os.Looper.loop(Looper.java:137)
11-08 15:16:03.640:E / AndroidRuntime(5306):位于android.app.ActivityThread.main(ActivityThread.java:5306)
11-08 15:16:03.640:E / AndroidRuntime(5306):at java.lang.reflect.Method.invokeNative(本机方法)
11-08 15:16:03.640:E / AndroidRuntime(5306):at java.lang.reflect.Method.invoke(Method.java:511)
11-08 15:16:03.640:E / AndroidRuntime(5306):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1102)
11-08 15:16:03.640:E / AndroidRuntime(5306):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
11-08 15:16:03.640:E / AndroidRuntime(5306):在dalvik.system.NativeStart.main(本机方法)
11-08 15:16:03.640:E / AndroidRuntime(5306):由以下原因引起:java.lang.reflect.InvocationTargetException
11-08 15:16:03.640:E / AndroidRuntime(5306):at java.lang.reflect.Method.invokeNative(本机方法)
11-08 15:16:03.640:E / AndroidRuntime(5306):at java.lang.reflect.Method.invoke(Method.java:511)
11-08 15:16:03.640:E / AndroidRuntime(5306):在android.view.View $ 1.onClick(View.java:3753)
11-08 15:16:03.640:E / AndroidRuntime(5306):...还有14个
11-08 15:16:03.640:E / AndroidRuntime(5306):由:java.lang.NullPointerException
11-08 15:16:03.640:E / AndroidRuntime(5306):位于pkg.robearthsoftworks.Main.updateTestListState(Main.java:114)
11-08 15:16:03.640:E / AndroidRuntime(5306):...还有17个
最佳答案
抱歉,您的代码很糟糕。
您做了很多findViewById
,这需要很长时间才能进行操作(VS其他方法)。使用您的代码,您的listview
对每个项目执行findViewById
。
将static holder
与custom adapter
一起使用,这样就不必做很多findViewById
。
我建议您花一些时间在本教程上:
http://www.vogella.com/tutorials/AndroidListView/article.html
或在getView
和holder
的工作方式上进行一些搜索。
如果您仍然坚持使用代码,请发布您的logcat
,以便我为您提供帮助。 (但我不
推荐)。