问题 ListView.removeFooterView崩溃(查看)


我正在收到崩溃报告

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

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

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

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

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


8653
2018-06-20 19:04


起源



答案:


不幸的是,你没有提到错误报告来自哪个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行失败 mAdapter == null,这不会导致较新的实施崩溃。

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


14
2018-06-20 19:46



添加页脚的策略是什么?我在FROYO和listView.getFooterCount()> 0上再次收到此错误。 - Code Droid
“lv.getAdapter()!= null”的工作对我有用 - djleop
在设置适配器后,我有可能调用removeFooter()。 - salcosand


答案:


不幸的是,你没有提到错误报告来自哪个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行失败 mAdapter == null,这不会导致较新的实施崩溃。

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


14
2018-06-20 19:46



添加页脚的策略是什么?我在FROYO和listView.getFooterCount()> 0上再次收到此错误。 - Code Droid
“lv.getAdapter()!= null”的工作对我有用 - djleop
在设置适配器后,我有可能调用removeFooter()。 - salcosand


如果您查看文档,您会注意到实际情况如此:

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

返回

如果视图已删除,则返回true;如果视图不是页脚视图,则返回false

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


0
2018-06-20 19:43



在异常块中包装空指针仍然会崩溃! - Code Droid
该文档并未指示尝试删除空视图会导致应用程序崩溃。 - Code Droid
我不相信删除空视图会使应用程序崩溃。我认为它可能是null适配器。 - Code Droid