2012-06-20 59 views
10

我对崩溃的ListView.removeFooterView(查看)

android.widget.ListView lv; lv.removeFooterView(v) 

错误越来越崩溃报告是空指针异常。我检查listView本身不是null。这是什么原因?是否有必要确保要删除的视图不为空?这是足够的还是我首先还需要检查页脚视图实际上是否已添加?

java.lang.NullPointerException 
at android.widget.ListView.removeFooterView(ListView.java:374) 

在我看来,这种方法应该是足够强大,不死机!为什么它不能仅仅在不能删除视图的情况下返回false?

PS。我想知道是否有其他人看到了这个?

回答

13

不幸的是,你不提什么Android版本的错误报告的来源。然而,看看源代码,Android 2.1-update1似乎是一个不错的选择。

我会在整个方法只是复制到把事情说清楚:

public boolean removeFooterView(View v) { 
    if (mFooterViewInfos.size() > 0) { 
     boolean result = false; 
     if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) { // <- line 274 
      mDataSetObserver.onChanged(); 
      result = true; 
     } 
     removeFixedViewInfo(v, mFooterViewInfos); 
     return result; 
    } 
    return false; 
} 

现在比较上述removeFooterView(...)方法具有更近的平台实现:

public boolean removeFooterView(View v) { 
    if (mFooterViewInfos.size() > 0) { 
     boolean result = false; 
     if (mAdapter != null && ((HeaderViewListAdapter) mAdapter).removeFooter(v)) { 
      if (mDataSetObserver != null) { 
       mDataSetObserver.onChanged(); 
      } 
      result = true; 
     } 
     removeFixedViewInfo(v, mFooterViewInfos); 
     return result; 
    } 
    return false; 
} 

正如你所看到的,对于某些不是null的成员,我补充了一些额外的支票。这表明,如果mAdapter == null,第一种方法确实会在第274行失败,而这不会导致新的实现崩溃。

要解决它,你可能需要做的是试图删除页脚视图之前添加类似lv.getAdapter() != null

+0

添加页脚的策略是什么?我对升级Froyo再次得到这个错误,并且listView.getFooterCount()> 0 –

+1

工作围绕“lv.getAdapter()!= NULL”对我来说 – djleop

+0

工作,我只好打电话给removeFooter()后,我设置适配器的可能性。 – salcosand

0

如果你看看,你会发现,这其实是这样的文件:

http://developer.android.com/reference/android/widget/ListView.html)

返回

真如果视图被删除,假如果视图不是页脚视图

所以你应该为视图和listView添加一个空检查,或者如果这是一个exc可选状态(很少发生,然后将其包装在异常块中)。

+0

结束语一个空指针异常块仍将崩溃! –

+0

该文档并不表示尝试删除空视图会导致应用程序崩溃。 –

+0

我不认为删除空视图会导致应用程序崩溃。我认为它可能是空适配器。 –