11

我收到崩溃报告

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

错误是空指针异常。我检查 listView 本身不为空。这是什么原因造成的?是否有必要确保要删除的视图不为空?这是否足够,还是我首先需要检查页脚视图是否已添加?

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

在我看来,这种方法应该足够强大而不会崩溃!如果它不能删除视图,为什么它不只是返回 false ?

PS。我想知道有没有其他人看过这个?

4

2 回答 2

14

不幸的是,您没有提及错误报告来自哪个 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. 这表明第一种方法确实会在第 274 行 if 失败mAdapter == null,而新的实现不会导致崩溃。

要解决这个问题,您可能需要做的就是lv.getAdapter() != null在尝试删除页脚视图之前添加类似的内容。

于 2012-06-20T19:46:28.267 回答
0

如果您查看文档,您会发现实际上是这样的:

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

退货

如果视图被删除,则为 true;如果视图不是页脚视图,则为 false

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

于 2012-06-20T19:43:39.440 回答