ListView 自定义item布局 android.widget.LinearLayout$LayoutParams

本文介绍了一个关于Android开发中ListView与自定义BaseAdapter结合使用时出现的ClassCastException异常问题。通过分析错误日志及代码片段,指出了解决方案——避免对外层LinearLayout设置LayoutParams。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 05-09 10:51:21.522: ERROR/AndroidRuntime(4425): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams  
 


  1.     setListAdapter(new BaseAdapter() {  
  2.               
  3.             @Override  
  4.             public View getView(int position, View convertView, ViewGroup parent) {  
  5.                 LinearLayout lnLayout = new LinearLayout(ListActivityDemo02.this);  
  6. //              lnLayout.setLayoutParams(new LinearLayout.LayoutParams(   
  7. //                      ViewGroup.LayoutParams.FILL_PARENT, android.R.attr.listPreferredItemHeight));   
  8.                 lnLayout.setOrientation(LinearLayout.VERTICAL);  
  9.                 ViewGroup.LayoutParams tvLayout = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,  
  10.                             ViewGroup.LayoutParams.WRAP_CONTENT);  
  11.                   
  12.                 TextView tv = new TextView(ListActivityDemo02.this);  
  13.                 tv.setText("hello world");  
  14.                 tv.setLayoutParams(tvLayout);  
  15.                 lnLayout.addView(tv);  
  16.                   
  17.                 TextView tv2 = new TextView(ListActivityDemo02.this);  
  18.                 tv2.setText("hello world111111111");  
  19.                 tv2.setLayoutParams(tvLayout);  
  20.                 lnLayout.addView(tv2);  
  21.                   
  22.                   
  23.                 return lnLayout;  
  24.             }  
  25.               
  26.             @Override  
  27.             public long getItemId(int position) {  
  28.                 return 1;  
  29.             }  
  30.               
  31.             @Override  
  32.             public Object getItem(int position) {  
  33.                 return null;  
  34.             }  
  35.               
  36.             @Override  
  37.             public int getCount() {  
  38.                 return 1;  
  39.             }  
  40.         });  
 


如果对外层的 Layout设置属性的话, 

lnLayout.setLayoutParams(new LinearLayout.LayoutParams(

      ViewGroup.LayoutParams.FILL_PARENT, android.R.attr.listPreferredItemHeight));


则会报错。。。如上的错误信息,,具体的如下

解决办法就是取消对其中的设置


  1. 05-05 18:42:22.331: ERROR/AndroidRuntime(5833): ERROR: thread attach failed  
  2. 05-05 18:42:23.581: ERROR/AndroidRuntime(5848): Uncaught handler: thread main exiting due to uncaught exception  
  3. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams  
  4. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.ListView.setupChild(ListView.java:1702)  
  5. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.ListView.makeAndAddView(ListView.java:1671)  
  6. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.ListView.fillDown(ListView.java:637)  
  7. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.ListView.fillFromTop(ListView.java:694)  
  8. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.ListView.layoutChildren(ListView.java:1521)  
  9. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.AbsListView.onLayout(AbsListView.java:1113)  
  10. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  11. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)  
  12. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)  
  13. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)  
  14. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  15. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:900)  
  16. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  17. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)  
  18. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  19. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)  
  20. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)  
  21. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.LinearLayout.onLayout(LinearLayout.java:918)  
  22. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  23. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)  
  24. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.View.layout(View.java:6834)  
  25. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1016)  
  26. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1666)  
  27. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.os.Handler.dispatchMessage(Handler.java:99)  
  28. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.os.Looper.loop(Looper.java:123)  
  29. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at android.app.ActivityThread.main(ActivityThread.java:4603)  
  30. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at java.lang.reflect.Method.invokeNative(Native Method)  
  31. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at java.lang.reflect.Method.invoke(Method.java:521)  
  32. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)  
  33. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
  34. 05-05 18:42:23.601: ERROR/AndroidRuntime(5848):     at dalvik.system.NativeStart.main(Native Method)  
  35. 05-05 18:42:25.341: ERROR/PackageInstallationReceiver(146): Remove /data/local/tmp/com.mmb.shop.apk Fail!  
  36. 05-05 18:42:34.381: ERROR/ActivityManager(88): fail to set top app changed!  
 



看到http://hi.baidu.com/ljlkings/blog/item/86ed2401029b4efd08fa9303.html


受到了一点启发 :


Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
2010-12-21 17:38

 

These supply parameters to the parent of this view specifying how it should be arranged. There are many subclasses of ViewGroup.LayoutParams, and these correspond to the different subclasses of ViewGroup that are responsible for arranging their children.

So basically, if you are adding a view to another, you MUST set the LayoutParams of the view to the LayoutParams type that the parent uses, or you will get a runtime error.

 

 

就是說你要設置此layoutparameters須對父對象佈局設定,最上層的layout不需設定此項。

 

编写一个Android应用,其中包含一个列表框(ListView)。列表框应显示一系列项目,例如“项目1”、“项目2”和“项目3”。当列表中的项目被点击时,应显示一个Toast消息,显示被点击项目的文本。 MainActivity.java import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ListView listView; private String[] items = {"项目1", "项目2", "项目3"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.my_listview); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = items[position]; Toast.makeText(MainActivity.this, "你点击了:" + item, Toast.LENGTH_SHORT).show(); } }); } } activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/my_listview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 修改建议: 1添加更多列表项到items数组中。 2更改列表项的布局(例如使用自定义的列表项布局)。 3尝试在点击事件中执行其他操作,如导航到另一个Activity或更新UI。 4调整ListView的高度,比如设置为wrap_content或指定具体的dp值。(给出详细步骤)
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值