我有一个包含两个列表的布局。由于您无法将列表放在ScrollView
我尝试使用ExpandableListView
,并使用自定义SimpleExpandableListAdapter
,因为this question。
列表布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<ExpandableListView android:id="@+id/android:list"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>
现在,当我尝试添加标题时出现问题。如果我从代码创建一个布局,它就可以工作:
LinearLayout ll = new LinearLayout( this );
ll.setOrientation( LinearLayout.VERTICAL );
TextView t = new TextView( this );
t.setText( "some text" );
ll.addView( t );
ImageView i = new ImageView( this );
i.setImageResource( R.drawable.icon );
ll.addView( i );
getExpandableListView( ).addHeaderView( ll );
如果我使用相同的布局,或者甚至比代码中的布局更简单,应用程序甚至会在屏幕上显示之前崩溃。这是我想要添加为上面列表标题的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:id="@+id/ll">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="some text"/>
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/icon"/>
</LinearLayout>
代码:
LinearLayout ll = (LinearLayout)findViewById( R.id.ll );
getExpandableListView( ).addHeaderView( ll );
我试图摆弄布局中所有组件的layout_width或高度,但它不起作用。最令我困惑的是,当它崩溃时,在调用setAdapter时DDMS上显示NullPointerException
(当我使用代码中的布局时,它没有添加适配器就好了):
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.stephan.test/org.stephan.test.ExpandableListViewTest}: java.lang.NullPointerException
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2833)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread.access$2300(ActivityThread.java:136)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2179)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.os.Handler.dispatchMessage(Handler.java:99)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.os.Looper.loop(Looper.java:143)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread.main(ActivityThread.java:5068)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at java.lang.reflect.Method.invokeNative(Native Method)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at java.lang.reflect.Method.invoke(Method.java:521)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at dalvik.system.NativeStart.main(Native Method)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): Caused by: java.lang.NullPointerException
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.widget.ListView.clearRecycledState(ListView.java:506)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.widget.ListView.resetList(ListView.java:492)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.widget.ListView.setAdapter(ListView.java:424)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ExpandableListActivity.setListAdapter(ExpandableListActivity.java:246)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at org.stephan.test.ExpandableListViewTest.onCreate(ExpandableListViewTest.java:80)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1066)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2797)
01-16 01:17:27.447: ERROR/AndroidRuntime(21314): ... 11 more
所以,我的问题是:我在这里做错了什么?而且,如果有任何关于如何做得更好的建议?
答案 0 :(得分:5)
我找到了解决方案。而不是用
创建一个新的布局
LinearLayout ll = (LinearLayout)findViewById( R.id.ll );
你需要给它充气!以下是诀窍:
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
LinearLayout ll = (LinearLayout)layoutInflater.inflate( R.layout.ll, null, false );
getExpandableListView( ).addHeaderView( ll );
其中ll.xml是您打算作为标题附加到列表的布局。希望这有助于其他人! :)
答案 1 :(得分:0)
ExpandableListActivity有一个默认值 布局由单个, 全屏,中心可扩展列表。 但是,如果你愿意,你可以 通过设置自定义屏幕布局 你自己的视图布局 onCreate()中的setContentView()。去做 这个,你自己的观点必须包含一个 具有id的ExpandableListView对象 “@android:id / list”(如果它在,则列出 代码)
http://developer.android.com/reference/android/app/ExpandableListActivity.html
因此,在自定义布局中,将ID从ll
更改为@android:id/list
。另外,使用您的自定义布局文件调用setContentView
。
我不太清楚你打算做什么但是一旦你更好地解释它,我可能会进一步帮助你。 (我看到它的方式,似乎你想获得列表视图,然后将该列表视图添加到其标题中...很奇怪)
修改强>
尝试使用以下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:id="@+id/ll">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="some text"/>
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/icon"/>
</LinearLayout>
<ListView android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00FF00"
android:drawSelectorOnTop="false"/>
<TextView android:id="@id/android:empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="No data"/>
</LinearLayout>