2012-12-15 22 views
0

在我的应用程序中,我使用Android自定义视图来显示一些日志信息。在这个观点中,我想根据一些标准来改变项目的颜色。我试着用下面的代码在getView中导致NullPointerException。Android自定义列表视图中的NullPointerException

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    try { 
     View row = convertView; 
     ItemHolder holder = null; 

     if(row == null){ 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResouceId, parent, false); 

      holder = new ItemHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtPhoneno = (TextView)row.findViewById(R.id.lvphoneno); 
      holder.txtDateTime = (TextView)row.findViewById(R.id.lvdatetime); 
      holder.txtSerialno = (TextView)row.findViewById(R.id.lvserialno); 
      holder.txtStatus = (TextView)row.findViewById(R.id.lvstatus); 

      row.setTag(holder); 
     } 
     else { 
      holder = (ItemHolder)row.getTag(); 
     } 

     MyListViewItem item = items.get(position); 
     holder.imgIcon.setImageResource(item.icon); 
     holder.txtPhoneno.setText(item.phoneno); 
     holder.txtDateTime.setText(item.datetime); 
     holder.txtSerialno.setText(item.serialno); 

     if(!item.status.isEmpty()){ 
      if(-1 != item.status.indexOf("OK")) 
       holder.txtStatus.setTextColor(Color.GREEN); 
      else 
       holder.txtStatus.setTextColor(Color.RED); 
     } 

     holder.txtStatus.setText(item.status); 
     return row;   
    } 
    catch (Exception e) { 
     Helper.Log(getContext(), e.toString()); 
    } 
    return null; 
} 

,但一个有趣的事情,当我删除以下行,它工作正常

 if(!item.status.isEmpty()){ 
      if(-1 != item.status.indexOf("OK")) 
       holder.txtStatus.setTextColor(Color.GREEN); 
      else 
       holder.txtStatus.setTextColor(Color.RED); 
     } 

logcat的

12-15 07:04:49.668: E/AndroidRuntime(331): FATAL EXCEPTION: main 
    12-15 07:04:49.668: E/AndroidRuntime(331): java.lang.NullPointerException 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.AbsListView.obtainView(AbsListView.java:1432) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.ListView.makeAndAddView(ListView.java:1745) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.ListView.fillDown(ListView.java:670) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.ListView.fillSpecific(ListView.java:1302) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.ListView.layoutChildren(ListView.java:1576) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.AbsListView.onLayout(AbsListView.java:1260) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.View.layout(View.java:7175) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.View.layout(View.java:7175) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.View.layout(View.java:7175) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.View.layout(View.java:7175) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.View.layout(View.java:7175) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.ViewRoot.performTraversals(ViewRoot.java:1140) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.os.Handler.dispatchMessage(Handler.java:99) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.os.Looper.loop(Looper.java:123) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at android.app.ActivityThread.main(ActivityThread.java:3683) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at java.lang.reflect.Method.invokeNative(Native Method) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at java.lang.reflect.Method.invoke(Method.java:507) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    12-15 07:04:49.668: E/AndroidRuntime(331): at dalvik.system.NativeStart.main(Native Method) 

请帮我解决这个问题

感谢

+0

当你的应用程序崩溃时,你应该总是发布你的LogCat,但我仍然猜测。 – Sam

+0

为什么你在异常块外的'getView()'中返回null, - 味道不好!至于NPE本身,你确定'layoutResouceId'是'row'的实际资源,**应该是非空吗?如果是这样的话,那么NPE来自其他地方 - logcat请! – t0mm13b

回答

1

我敢打赌,status为空:

if(-1 != item.status.indexOf("OK")) 

item显然不是零和假设holder.txtStatus.setText()不要么抛出NPE,这只是叶status ...

(但没有更多的信息我无法超越此范围。)

+0

我用null状态检查器和logcat修改了我的问题 – Riskhan

+0

你在测试这个API吗? – Sam

+0

listview的输入数据来自数据库。我检查了状态的值,它不为空。我改变了检查null的值。现在它正在工作,无论如何感谢 – Riskhan