ListView.removeFooterView崩溃(查看)

Cod*_*oid 11 android android-layout

我正在收到崩溃报告

 android.widget.ListView  lv;  lv.removeFooterView(v)
Run Code Online (Sandbox Code Playgroud)

错误是空指针异常.我检查listView本身不是null.是什么导致这个?是否有必要确保要删除的视图不为空?这还不够,还是我首先需要检查是否实际添加了页脚视图?

java.lang.NullPointerException
at android.widget.ListView.removeFooterView(ListView.java:374)
Run Code Online (Sandbox Code Playgroud)

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

PS.我想知道是否有其他人见过这个?

MH.*_*MH. 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;
}
Run Code Online (Sandbox Code Playgroud)

现在将上述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;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,已经为某些成员添加了一些额外的检查null.这表明第一种方法确实会在第274行失败,如果mAdapter == null,这不会导致较新的实现崩溃.

要解决它,您可能需要做的就是lv.getAdapter() != null在尝试删除页脚视图之前添加一些内容.