Android 适配器返回 LinearLayout

发布于 2024-11-30 16:16:35 字数 3379 浏览 9 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

纵山崖 2024-12-07 16:16:35

设置 AbsListView.LayoutParams 而不是 LinearLayout.LayoutParams

LayoutParams 将为 ViewGroup 中的子项设置。由于您的布局是 AbsListView 的子级,因此您应该设置其布局参数。

Set AbsListView.LayoutParams instead of LinearLayout.LayoutParams.

LayoutParams are to be set for a child in ViewGroup. Since your layout is a child of AbsListView you should set its layoutparams.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文