Android 适配器返回 LinearLayout
我有一个 ListView 的自定义适配器,我需要从 getView() 返回 LinearLayout。我这样做的原因是我有自定义组件,它扩展了 LinearLayout 并且需要从代码创建。问题是,如果我从 getView() 返回任何 LinearLayout,应用程序就会崩溃。我怎样才能让它工作?我无法从 xml 扩充视图,一切都必须通过代码完成。
这是 getView():
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LinearLayout lay = new LinearLayout(MyApplication.getContext()); // gets the context from extended Application class
lay.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
return lay;
}
以及发生的情况的日志:
08-20 08:40:07.886: DEBUG/AndroidRuntime(13039): Shutting down VM
08-20 08:40:07.896: WARN/dalvikvm(13039): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
08-20 08:40:07.926: ERROR/AndroidRuntime(13039): FATAL EXCEPTION: main
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1870)
at android.widget.ListView.makeAndAddView(ListView.java:1839)
at android.widget.ListView.fillDown(ListView.java:670)
at android.widget.ListView.fillFromTop(ListView.java:727)
at android.widget.ListView.layoutChildren(ListView.java:1689)
at android.widget.AbsListView.onLayout(AbsListView.java:1260)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7278)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1243)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1049)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7278)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7278)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7278)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1172)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1921)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
谢谢
// 编辑:如果有人可以为我提供一个通过代码创建 LinearLayout 并从 getView() 返回它的工作示例,它很可能会解决这个问题
I have a custom adapter for ListView and I need to return LinearLayout from getView(). The reason I'm doing it is that I have custom component which extends LinearLayout and need to be created from code. The problem is that if I return any LinearLayout from getView(), the application crashes. How can I get it working? I can't inflate the View from xml, everything has to be done via code.
Here's the getView():
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LinearLayout lay = new LinearLayout(MyApplication.getContext()); // gets the context from extended Application class
lay.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
return lay;
}
And log of what happens:
08-20 08:40:07.886: DEBUG/AndroidRuntime(13039): Shutting down VM
08-20 08:40:07.896: WARN/dalvikvm(13039): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
08-20 08:40:07.926: ERROR/AndroidRuntime(13039): FATAL EXCEPTION: main
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1870)
at android.widget.ListView.makeAndAddView(ListView.java:1839)
at android.widget.ListView.fillDown(ListView.java:670)
at android.widget.ListView.fillFromTop(ListView.java:727)
at android.widget.ListView.layoutChildren(ListView.java:1689)
at android.widget.AbsListView.onLayout(AbsListView.java:1260)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7278)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1243)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1049)
at android.view.View.layout(View.java:7278)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7278)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7278)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7278)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1172)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1921)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4196)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Thanks
// edit: If somebody could provide me with a working sample which creates LinearLayout via code and returns it from getView(), it would most likely solve this problem
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
设置
AbsListView.LayoutParams
而不是LinearLayout.LayoutParams
。LayoutParams
将为ViewGroup
中的子项设置。由于您的布局是 AbsListView 的子级,因此您应该设置其布局参数。Set
AbsListView.LayoutParams
instead ofLinearLayout.LayoutParams
.LayoutParams
are to be set for a child inViewGroup
. Since your layout is a child ofAbsListView
you should set its layoutparams.