1

我正在创建一个自定义 Gridview,每个单元格都由包含的布局表示

  • 1) 自定义 RatingBar
  • 2) 图像视图

我在 Adaptor 的 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。而 ViewGroup.MarginLayoutParams 实际上扩展了 ViewGroup.LayoutParams。

有时布局类需要额外的布局信息才能与子视图相关联。为此,他们定义了内部静态 LayoutParams 类。例如,LinearLayout 有:

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

相对布局也一样:

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 根本没有这些能力。

所以一般来说,你必须使用封闭布局中的 LayoutParams 来使你的视图正确定位和渲染。但请注意,所有 LayoutParams 都有相同的父类 ViewGroup.LayoutParams。如果您只使用在该类中定义的功能(例如在您的情况下为 WRAP_CONTENT 和 FILL_PARENT),您可以获得工作代码,即使错误的 LayoutParams 类用于指定布局参数。

于 2013-03-01T09:00:32.353 回答