2011-01-16 4 views
2

У меня есть макет, содержащий два списка. Поскольку вы не можете поместить списки в 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 

Итак, мой вопрос в том, что я делаю неправильно здесь? И, в случае, какие-либо советы о том, как я мог бы сделать это лучше?

ответ

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 - это макет, который вы планируете прикрепить к списку в виде заголовка. Надеюсь, это поможет кому-то еще! :)

0

ExpandableListActivity имеет расположение по умолчанию, который состоит из одного, полного экрана, в центре расширения списка. Однако, если вы желаете, вы можете настроить размер экрана, установив свой собственный макет вида с setContentView() в onCreate(). Для того, чтобы сделать это, ваш собственный взгляд должен содержать объект ExpandableListView с идентификатором «@android: ид/список» (или список, если он находится в коде)

http://developer.android.com/reference/android/app/ExpandableListActivity.html

Таким образом, в вашем пользовательский макет, измените идентификатор с ll на @android:id/list. Кроме того, позвоните setContentView с вашим пользовательским файлом макета.

Я не совсем понял, что вы намеревались сделать, но как только вы объясните это лучше, я могу помочь вам дальше. (То, как я вижу это, кажется, что вы хотите получить представление списка, а затем добавить, что представление списка в заголовке ... странно)

EDIT:

попробуйте использовать следующую схему :

<?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> 
+0

Привет, Педро, спасибо, что ответили. Я хочу достичь: в одном макете у меня правильно установлена ​​функция ExpListView с идентификатором, который вы говорите. Я хочу добавить отдельный макет в качестве заголовка списка. отредактирует мой вопрос, чтобы отобразить макет списка. – Stephan

+0

Является ли другая компоновка статической? Если это так, у вас гораздо более простое решение. Кроме того, вы используете расширяющийся макет, потому что вам нужно его перечислить свои «вещи» или, по какой-то причине, вы считаете, что вам нужно это, чтобы объединить два макета? –

+0

Макет заголовка будет заполняться динамически, основываясь на данных, которые я получаю, поэтому он не может быть статичным (если по 'static' вы имеете в виду помещать данные в xml). Я использую расширяющийся макет, потому что у меня есть два разных списка, и я думал, что таким образом я могу использовать разные макеты для подгрупп. Затем, поскольку я хочу, чтобы этот знаменитый заголовок прокручивался вместе со списком, стало естественным думать, что это заголовок. Но я застрял на этом уже 3 дня, поэтому я открыт для предложений! :) – Stephan