質問

SOのようにヘッダーを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)), 、しかし、私はその理由を理解することはできません。何か案は?

役に立ちましたか?

解決

わかりました、私はこれを理解しました。 Viewの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には多くのサブクラスがあり、これらは子供を配置する責任があるさまざまなビューグループに対応しています。

基本的に、別のビューにビューを追加する場合は、親が使用するレイアウトパラムタイプにビューのレイアウトパラムを設定する必要があります。そうしないと、ランタイムエラーが表示されます。

他のヒント

上記の答えは多くの人にとってうまくいくかもしれませんが、まだより良い説明があります。ClassCastException 呼び出し後の通常の動作です listview.addHeaderView また listview.addFooterView.

その理由は、初期アダプターが HeaderViewListAdapter. 。アダプターを取得するには、このコードを使用します。

YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter();

ここから取得したコード

私の場合、これはうまくいきませんでした。アダプターを設定する前に、listViewにFooterViewを設定する必要がありました。最初に、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);
    }
}

膨らんだビューに親のビューを置く必要があります。

ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top