1

カスタム Gridview を作成しています。各セルは、レイアウトで表されます。

  • 1) カスタム評価バー
  • 2) イメージビュー

アダプターの getView() 内でそれらを膨らませます。

上記のレイアウトが線形タイプである場合、正常に機能します。しかし、フレーム/相対レイアウトに置き換えると、Logcat でこれでクラッシュします。

04-20 18:19:16.921: E/AndroidRuntime(24111): FATAL EXCEPTION: main
04-20 18:19:16.921: E/AndroidRuntime(24111): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.RelativeLayout$DependencyGraph.findRoots(RelativeLayout.java:1303)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.RelativeLayout$DependencyGraph.getSortedViews(RelativeLayout.java:1250)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.RelativeLayout.sortChildren(RelativeLayout.java:281)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:303)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.View.measure(View.java:8313)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.GridView.onMeasure(GridView.java:950)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.View.measure(View.java:8313)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.View.measure(View.java:8313)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.View.measure(View.java:8313)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.os.Looper.loop(Looper.java:123)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at android.app.ActivityThread.main(ActivityThread.java:3683)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at java.lang.reflect.Method.invokeNative(Native Method)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at java.lang.reflect.Method.invoke(Method.java:507)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-20 18:19:16.921: E/AndroidRuntime(24111):    at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

1

すべてのレイアウトクラス(LinearLayout、RelativeLayoutなど)はViewGroupを拡張します。

ViewGroupクラスには、LayoutParamsとMarginLayoutParamsの2つの静的内部クラスがあります。そして、ViewGroup.MarginLayoutParamsは実際にはViewGroup.LayoutParamsを拡張します。

レイアウトクラスでは、子ビューに関連付けるために追加のレイアウト情報が必要になる場合があります。このために、内部の静的LayoutParamsクラスを定義します。たとえば、LinearLayoutには次のものがあります。

public class LinearLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

RelativeLayoutについても同じです。

public class RelativeLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

ただし、LinearLayout.LayoutParamsとRelativeLayout.LayoutParamsは完全に異なる独立したクラスです。それらは、子ビューに関するさまざまな追加情報を格納します。

たとえば、LinearLayout.LayoutParamsはウェイト値を各ビューに関連付けることができますが、RelativeLayout.LayoutParamsは関連付けることができません。RelativeLayout.LayoutParamsでも同じことが言えます。これは、上記、下記、alightWithParentなどの値を各ビューに関連付けることができます。そして、LinearLayout.LayoutParamsにはこれらの機能がありません。

したがって、一般に、ビューを正しく配置およびレンダリングするには、レイアウトを囲むレイアウトParamsを使用する必要があります。ただし、すべてのLayoutParamには同じ親クラスViewGroup.LayoutParamsがあることに注意してください。また、そのクラスで定義されている機能(WRAP_CONTENTやFILL_PARENTの場合など)のみを使用すると、間違ったLayoutParamsクラスを使用してレイアウトパラメーターを指定した場合でも、機能するコードを取得できます。

于 2013-03-01T09:00:32.353 に答える