4

まず、このバグを解決する方法はすでにわかっていますが、現時点では、なぜ私の修正が機能するのか疑問に思っています。私が遭遇した状況ClassCastException, cannot convert LinearLayout$LayoutParams to AbsListView$LayoutParamsは、次のことをしようとしたときにエラーが発生したことでした (これらの目的のために簡略化されています)。

mLayout = (LinearLayout) getLayoutInflater()
   .inflate(R.layout.my_header_layout, 
   getListView(), false);
mRootView.addView(mLayout);
getListView().addHeaderView(mLayout);
getListView().setAdapter(mAdapter);

私は最終的にそれを分解し、への呼び出しを削除したときに問題が修正されたことを発見しましたmRootView.addView(mLayout)

私の 2 つの質問は、なぜこれが起こっているのかということです。まず、概念的な面では、ヘッダー ビューが既にレイアウトにある場合、全体が死んでしまうのはなぜですか? そのビューが効果的に 2 回レイアウトされようとしているからでしょうか? 1 回はヘッダー用で、もう 1 回は実際のレイアウト用ですか?

第二に、なぜこの例外なのですか?それはひどく説明的ではなく、実際の問題をまったく捉えていないように見えますか? とにかく低レベルの関数が結果で失敗するため、これは高レベルの問題が処理されていない場合ですか?

4

2 に答える 2

4

私の質問は、なぜこれが起こっているのですか?まず、概念的な面では、ヘッダー ビューが既にレイアウトにあると、全体が死んでしまうのはなぜですか? そのビューが効果的に 2 回レイアウトされようとしているからでしょうか? 1 回はヘッダー用で、もう 1 回は実際のレイアウト用ですか?

あなたのレイアウトパラメータはここで狂っています。それが問題です。

  • inflate()ListView をルートとして渡すため、に割り当てListView.LayoutParamsて呼び出されます。ドキュメントからmLayout

root:生成された階層の親となるオプションのビュー (attachToRoot が true の場合)、または単に返された階層のルートの LayoutParams 値のセットを提供するオブジェクト (attachToRoot が false の場合)。

  • を使用するaddView()と、子のパラメーターのタイプがチェックされます。一致しない場合は、可能な限り変換します。これは、値を新しいコンストラクターにコピーすることによって行われます。だから、あなたのmLayout今がLinearLayout.LayoutParamsついています。

  • を呼び出すとaddHeaderView()mLayoutリストビューの子になります。その間に行われることの1つListView#setupChild()はこれです:

    AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();

これは、ClassCastException を取得している場所であることはほぼ間違いありません。そのようなストレートキャストを行うことはできません。


第二に、なぜこの例外なのですか?それはひどく説明的ではなく、実際の問題をまったく捉えていないように見えますか?

それほど悪くはありませんが、レイアウト システムがどのように機能するかを理解する必要があります。簡単なチェックを行い、正しくない場合はエラーまたはログ メッセージをスローすることができますか? もちろん。ListViewのように問題を適切に処理することはできLinearLayoutますか? もちろん。しかし、そうではありません。

より適切に処理できると思われる場合は、Android 開発者のフォーラム/グループ/トラッカーに投稿する価値があるかもしれません。

于 2013-07-30T17:47:17.593 に答える
0

それはすべて次の声明にあります。

cannot convert LinearLayout$LayoutParams to AbsListView$LayoutParams

LinearLayoutと2 つの異なるタイプのレイアウトがあるため、次を使用してAbsoluteListViewをセットアップする必要があります。LayoutParams

mLayout.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

AbsListView-specificを使用しているためですLayoutParams

于 2013-07-30T17:30:14.817 に答える