11

クラッシュレポートを取得しています

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

エラーはヌルポインタ例外です。listView 自体が null でないことを確認します。これは何が原因ですか?削除するビューが null でないことを確認する必要がありますか? それで十分ですか、それとも最初にフッター ビューが実際に追加されていることも確認する必要がありますか?

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 の両方に null チェックを追加するか、これが例外的な状態である場合 (非常にまれにしか発生しない場合は、例外ブロックにラップします) を追加する必要があります。

于 2012-06-20T19:43:39.440 に答える