44

次のようにExpandableListViewにヘッダーを追加しようとしています。

headerView = View.inflate(this, R.layout.header, null);
expandableListView.addHeaderView(headerView);
expandableListView.setAdapter(new SectionedAdapter(this));

これにより、次のエラーが発生します。

 12-08 16:23:42.354:
 ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
 12-08 16:23:42.354:   ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504)
 12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490)
 12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422)
 12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)

これはへの呼び出しで発生していますがexpandableListView.setAdapter(new SectionedAdapter(this))、理由がわかりません。何か案は?

4

4 に答える 4

91

わかりました、私はこれを理解しました。次のように、プログラムでビューの LayoutParams を ListView LayoutParams に設定することで、ランタイム エラーを取り除きました。

headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT));

ビューを追加する前に。その理由は、Android ドキュメントに記載されています。

http://developer.android.com/reference/android/view/View.html#setLayoutParams(android.view.ViewGroup.LayoutParams)

それは次のように述べています:

これらは、このビューのに、配置方法を指定するパラメーターを提供します 。ViewGroup.LayoutParams には多くのサブクラスがあり、これらは子の配置を担当する ViewGroup のさまざまなサブクラスに対応しています。

基本的に、ビューを別のビューに追加する場合は、ビューの LayoutParams を親が使用する LayoutParams タイプに設定する必要があります。そうしないと、実行時エラーが発生します。

于 2010-12-09T17:43:50.887 に答える
1

私の場合、これはうまくいきませんでした。アダプターを設定する前に、フッタービューをリストビューに設定する必要がありました。まず、OnCreate メソッドでレイアウト ファイルから loadingView を初期化しました。

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView = layoutInflater.inflate(R.layout.loading_view, null);

次に、同じ方法でこの回避策を使用しました。

this.setIsLoading(true);
listView.setAdapter(adapter);
this.setIsLoading(false);

どこ

private void setIsLoading(boolean isLoading)
{
    this.isLoading = isLoading;

    if (isLoading) {
        listView.addFooterView(loadingView);
    }
    else {
        listView.removeFooterView(loadingView);
    }
}
于 2013-11-28T17:39:26.780 に答える