2011-10-20 13 views
19

ListViewの場合はaddHeaderView()addFooterView()を使用しようとしています。ヘッダーまたはフッターのいずれかのXMLで定義済みのビューを使用しようとすると、NULLポインタ例外が発生します。しかし、私は動的にコードを使用してビューを作成する場合、それは正常に動作します...Android ListView XMLで定義された定義済みのビューのaddHeaderView()nullPointerException

// This doesn't work... nullPointerException 
ListView lv = (ListView) findViewById(R.id.my_list_view); 
TextView header = (TextView) findViewById(R.id.my_header); 
lv.addHeaderView(header); 

// This works fine 
ListView lv = (ListView) findViewById(R.id.my_list_view); 
TextView header = new TextView(this); 
TextView.setHeight(30); 
TextView.setText("my header text!"); 
lv.addHeaderView(header); 

私のスタックトレース:

Caused by: java.lang.NullPointerException 
    at android.widget.ListView.clearRecycledState(ListView.java:522) 
    at android.widget.ListView.resetList(ListView.java:508) 
    at android.widget.ListView.setAdapter(ListView.java:440) 
    at com.company.myapp.MyActivity.refreshList(MyActivity.java:85) 
    at com.company.myapp.MyActivity.onCreate(MyActivity.java:37) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    ... 11 more 

任意の手がかり?

答えて

97

EDIT:

あなたは、単にこれはhas to be inflatedに渡されているビューのでを動作しません

View header = findViewById(R.layout.headerView); 
lst.addHeaderView(header); 

を行うことはできません。一言で言えば、の開始時にsetContentViewを実行すると、アンドロイドフレームワークは自動的にビューを膨張させてを使用します。あなたのヘッダビューを膨らませるためには、あなたがしなければならないすべては、あなたがヘッダビューを設定し、アプリケーションを実行した後にアダプターを追加し、最後に

View header = (View)getLayoutInflater().inflate(R.layout.headerView,null); 
ls.addHeaderView(header); 

です。ヘッダービューには、アダプターに入れた内容が表示されます。私の場合は

、これが動作しているように見えます

View header = getLayoutInflater().inflate(R.layout.header, null); 
View footer = getLayoutInflater().inflate(R.layout.footer, null); 

ListView listView = getListView(); 

listView.addHeaderView(header); 
listView.addFooterView(footer);  

setListAdapter(new ArrayAdapter<String(this,android.R.layout.simple_list_item_single_choice,android.R.id.text1, names)); 
+0

に動作します。ダイナミックに作成された要素でうまく動作するのは本当に奇妙です。なぜ私はここでレイアウトインフレータフープを飛び越えなければならないのか分かりません。また、このメソッドは、私のビューのxmlに設定した余白を無視するように見える... –

+0

別のレイアウトでテキストビューを配置しようとすると、それを膨らませ、ヘッダーとフッタービューを設定するために使用した後にできますか? – user370305

+1

それはうまくいった。私は 'LinearLayout'に' TextView'をラップしました。私はこれを私の答えと記しておきますが、私はそれを機能させるためにフープを突き抜けなければならなかった理由を知りたがりました。それがバグかどうかわからない。ありがとう! –

関連する問題