【发布时间】:2011-05-10 19:44:40
【问题描述】:
我有一个自定义适配器来为 ListView 提供数据。一切正常,但是“突然”(我对现在正在发生的事情一无所知)我的应用程序在使用 listview 加载我的 Activity 时开始崩溃:
W/dalvikvm( 228): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 228): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 228): java.lang.NullPointerException
E/AndroidRuntime( 228): at AdvertisementListAdapter.getView(AdvertisementListAdapter.java:72)
E/AndroidRuntime( 228): at android.widget.AbsListView.obtainView(AbsListView.java:1274)
E/AndroidRuntime( 228): at android.widget.ListView.measureHeightOfChildren(ListView.java:1147)
E/AndroidRuntime( 228): at android.widget.ListView.onMeasure(ListView.java:1060)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
E/AndroidRuntime( 228): at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
E/AndroidRuntime( 228): at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
E/AndroidRuntime( 228): at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
E/AndroidRuntime( 228): at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
E/AndroidRuntime( 228): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
E/AndroidRuntime( 228): at android.view.View.measure(View.java:7964)
E/AndroidRuntime( 228): at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
E/AndroidRuntime( 228): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
E/AndroidRuntime( 228): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 228): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 228): at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime( 228): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 228): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 228): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime( 228): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime( 228): at dalvik.system.NativeStart.main(Native Method)
我的 getView 方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=convertView;
ViewHolder holder;
if(convertView==null){
view=inflater.inflate(R.layout.list_item, null);
holder=new ViewHolder();
holder.imgItemImage=(ImageView)view.findViewById(R.id.imgItemImage);
holder.tvItemTitle=(TextView)view.findViewById(R.id.tvItemTitle);
holder.tvItemDetails=(TextView)view.findViewById(R.id.tvItemDetails);
view.setTag(holder);
}else
holder=(ViewHolder)view.getTag();
holder.tvItemTitle.setText(data.get(position).getYear()+" "+data.get(position).getTitle());
StringBuilder sb=new StringBuilder();
sb.append(data.get(position).getPrice());
sb.append("\n");
sb.append(data.get(position).getCity());
holder.tvItemDetails.setText(sb.toString());
String imageUrl="http://myuri/"+data.get(position).getUrlList().get(0)+"/p-t.jpeg";
holder.imgItemImage.setTag(imageUrl);
imageLoader.displayImage(imageUrl, activity, holder.imgItemImage);
return view;
}
第一次调用getView时,convertView=null,所以ViewHolder对象被创建。但是在调用findViewById(...) 之后,ViewHolder 类的所有成员仍然为空。所以,这里是起源NullPointerException。正如我在调试期间看到的那样,视图膨胀是成功的,view 对象包含 RelativeLayout 及其子对象。
最糟糕的是,在它开始崩溃之前我没有更改这部分应用程序!
这让我发疯了!
【问题讨论】:
-
显示的类是否是抛出空指针的类?如果是,哪一行是 72?
-
72 是 holder=(ViewHolder)view.getTag();但是当我调试应用程序时第一次调用getView时没有到达第72行,因为convertView为空,所以在调试期间我在holder.tvItemTitle.setText(data.get(position).getYear()+" "+data.get (位置).getTitle());
-
您的数据变量是否可能已过时?以下可以返回null吗? data.get(位置)
-
在调试期间我检查了它,数据不为空。在 findViewById() 之后,我在 ViewHolder 视图中得到空值,我不知道为什么。一切都很好,直到明天晚上......
-
分解代码并将每个调用放在单独的行(至少出于调试目的)可能对您有利。
标签: android