【问题标题】:Android custom adapter getView() NullPointerException out of nowhere!Android 自定义适配器 getView() NullPointerException 无处不在!
【发布时间】: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


【解决方案1】:

您是否尝试过从头开始重建应用程序? 项目 -> 清理

【讨论】:

    【解决方案2】:

    尝试重建 R 类。在 Eclipse 中,它就像更改布局 XML 中的某些内容并再次保存以使 R.id.* 保持最新一样简单。有时他们会搞砸。

    【讨论】:

      【解决方案3】:

      所以,这就解决了。我尝试了改造,清洁项目。然后我从工作区中删除它并重新打开 - 它工作。那是 Eclipse 错误,太可怕了,我浪费了几个小时!感谢大家的回复!抱歉打扰了……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多