2011-01-16 3 views
2

私は2つのリストを含むレイアウトを持っています。 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); 

を、あるいはアプリケーションがクラッシュしても画面上に表示する前に、コードから1、より単純:私はこのように、コードからレイアウトを作成する場合、それは動作します。

<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> 

とコード:ここで私は上記のリストにヘッダとして追加したいレイアウトだ私は私のレイアウト内のすべてのコンポーネントのlayout_widthまたは高さをいじることを試みた

LinearLayout ll = (LinearLayout)findViewById(R.id.ll); 
getExpandableListView().addHeaderView(ll); 

、それは動作しません。一番私をバッフルは、それがクラッシュしたときに、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は、単一の、 フルスクリーンで構成され、デフォルト レイアウト、中心膨張可能なリストを有しています。 ただし、希望する場合は 自分の表示レイアウトを onContentView()でonCreate()に設定して、画面レイアウトをカスタマイズできます。 にこれを行うには、独自のビューは、ID "@android:ID /リスト" で ExpandableListViewオブジェクトを含まなければならない(それは コード内かどうか、リスト)

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

だから、あなたの中にカスタムレイアウトでは、IDを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

こんにちはペドロ、返信ありがとう。私が達成したいのは、1つのレイアウトで、ExpListViewがあなたが言うIDで正しく設定されていることです。私がしたいのは、リストヘッダとして別のレイアウトを追加することです。私の質問を編集してリストレイアウトも表示します。 – Stephan

+0

他のレイアウトは静的ですか?そうであれば、はるかに簡単な解決法があります。また、あなたの「もの」のリストを表示する必要があるため、または何らかの理由で2つのレイアウトをまとめておく必要があると思うので、拡大レイアウトを使用していますか? –

+0

ヘッダのレイアウトは、受け取ったデータに基づいて動的に埋められるため、静的にすることはできません( '静的'というのは、データをXMLに入れることを意味します)。私は2つの異なるリストを持っているので、拡大レイアウトを使用しています。この方法で、サブグループに異なるレイアウトを使用できると考えていました。その有名なヘッダーをリストでスクロールさせたいので、それをヘッダーと考えるのが自然でした。しかし、私は3日間これで立ち往生していたので、私は提案に開放されています! :) – Stephan