У меня есть макет, содержащий два списка. Поскольку вы не можете поместить списки в ScrollView
, я пытаюсь использовать ExpandableListView
, с пользовательским SimpleExpandableListAdapter
, согласно this question. макет
Список:layout as listview header
<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 или высотой около всех компонентов в моем макете, но это не сработает. Что расстраивает меня больше всего в том, что, когда он выходит из строя, на DDMS говорит NullPointerException
при вызове setAdapter (который не когда я использую макет из кода, и это добавляет адаптер просто отлично):
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
Итак, мой вопрос в том, что я делаю неправильно здесь? И, в случае, какие-либо советы о том, как я мог бы сделать это лучше?
Привет, Педро, спасибо, что ответили. Я хочу достичь: в одном макете у меня правильно установлена функция ExpListView с идентификатором, который вы говорите. Я хочу добавить отдельный макет в качестве заголовка списка. отредактирует мой вопрос, чтобы отобразить макет списка. – Stephan
Является ли другая компоновка статической? Если это так, у вас гораздо более простое решение. Кроме того, вы используете расширяющийся макет, потому что вам нужно его перечислить свои «вещи» или, по какой-то причине, вы считаете, что вам нужно это, чтобы объединить два макета? –
Макет заголовка будет заполняться динамически, основываясь на данных, которые я получаю, поэтому он не может быть статичным (если по 'static' вы имеете в виду помещать данные в xml). Я использую расширяющийся макет, потому что у меня есть два разных списка, и я думал, что таким образом я могу использовать разные макеты для подгрупп. Затем, поскольку я хочу, чтобы этот знаменитый заголовок прокручивался вместе со списком, стало естественным думать, что это заголовок. Но я застрял на этом уже 3 дня, поэтому я открыт для предложений! :) – Stephan