2011-10-20 24 views
19

嘗試使用addHeaderView()addFooterView()代替ListView。如果我嘗試使用XML中爲頁眉或頁腳預定義的View,我會得到一個空指針異常。不過,如果我動態地創建使用代碼視圖,它工作正常...Android ListView addHeaderView()nullPointerException在XML中定義的預定義視圖

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

編輯:

你根本無法做到

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

這是行不通的,因爲這是在has to be inflated傳遞的視圖。簡而言之,當您在活動開始時執行setContentView時,android框架將自動膨脹視圖並將其放置爲使用。爲了擡高你的頭視圖,所有你需要做的就是

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

工作。我只是將'TextView'包裝在'LinearLayout'中。我會把這個標記爲我的回答,但是我希望我知道爲什麼我必須跳過這些環節才能使其工作。無法確定它是一個錯誤還是什麼。謝謝! –