2013-10-25 61 views
19

我有一個編輯文本字段和一個「搜索」按鈕。當我點擊搜索時,我必須顯示一個列表視圖,其中的數據與edittext中輸入的值相對應。我使用addHeader()將頭添加到了我的列表中。當我第一次搜索時,我能夠成功地在列表中顯示數據。但是當我再次搜索時,我得到了下面的錯誤。無法添加標題視圖列表 - setAdapter已被稱爲

FATAL EXCEPTION: main 
java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called. 
at android.widget.ListView.addHeaderView(ListView.java:261) 
at android.widget.ListView.addHeaderView(ListView.java:284) 

我已經設置適配器之前分配頭到我的清單。

下面是我的代碼:

myList = (ListView) findViewById(R.id.searchResultsList); 
View header = View.inflate(this, R.layout.search_results_header, null); 
myList.addHeaderView(header, null, false); 

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults); 
myList.setAdapter(dataAdapter); 

我哪裏做錯了嗎?

+0

嘗試使用dataAdapter.notifyDataSetChanged();設置好適配器後。 –

+0

您是否檢查了此項[由Hiren Patel提供的答案] [1]。它會幫助你。 [1]:http://stackoverflow.com/questions/13217386/add-a-header-to-a-gridview-android/27290310#27290310 –

+0

之前4.4,適配器必須調用addHeaderView之前設置方法。你可以查看4.4和4.3源代碼的區別:http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/android/widget/ListView.java /?v=diff&id2=4.3.1_r1 –

回答

1

試試這個..

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults); 
myList.addHeaderView(header); 
myList.setAdapter(dataAdapter); 
dataAdapter.notifyDataSetChanged(); 
+0

爲什麼這個'adapter.notifyDataSetChanged()'刷新了一個lsitview? – Raghunandan

+0

@Raghunandan最初dataAdapter在輸入edittext後是空的,他需要添加視圖,所以需要刷新它。 – Hariharan

+0

我不這麼認爲,所以你需要'adapter.notifyDataSetChanged()'。 http://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View) – Raghunandan

11

不能頭視圖添加到列表 - setAdapter已經被調用。您可以看到,myList.addHeaderView(header)必須在 之前執行myList.setAdapter(adapter);

+2

在將適配器設置到列表之前,我已經將標題設置爲我的列表 – user2740599

+9

請注意,在4.4.4之前添加了它之前,我在舊設備上測試了此錯誤 – GuilhE

+0

thnx GuilhE ... 。 –

-2

我用下面的代碼在我的示例應用程序設置一個ListView頭:

ListView lv = getListView(); 
View headerView = getLayoutInflater().inflate(R.layout.layout_header, null, false); 
lv.addHeaderView(headerView); 
final TumblrDB db = new TumblrDB(this); 
c = db.query(); 
startManagingCursor(c); 
adapter = new CustomCursorAdapter(this, R.layout.layout_del, c, new String[]{TumblrDB.DATE, TumblrDB.DESC}, new int[]{R.id.txt_a, R.id.txt_b}); 
lv.setAdapter(adapter); 
24

在Android 2.3,setAdapter後添加標題(即使你已經添加的早期,然後取出)將拋出一個異常。要動態地隱藏或顯示標題,請使用setVisibility()。怎麼樣?你可以看到Hiding header views

+1

它工作。保存我的一天! – Ornithopter

0

你可以設置適配器之前添加的FrameLayout作爲頭圖和動態添加/刪除鑑於FrameLaypout

1

今天我有同樣的問題。我有多個ListViews。從第一個信息開始,它構建下一個列表,並且每個人都有setAdapter。 對我來說,最好的解決辦法是把

setListAdapter(null); 

在功能上,在那裏我膨脹頭的頂部。我希望這有助於..

1

如果您在xml文件中使用ListView中的android:entries,它在addHeaderView之前調用setAdapter()方法。因此,從xml佈局文件中的ListView中刪除android:entries屬性。這將是工作。

-1

經歷了這麼多努力,我得到的解決方案我身邊 我希望這可以幫助別人太

我已經設置adpater在最後(視圖中添加後),但不知道爲什麼我被同樣的錯誤suffring所以在這裏我做了這樣的代碼

// Set View here 
View view = getLayoutInflater().inflate(R.layout.navigation_header,null); 
mDrawerList.addHeaderView(view); 
// init your adapter 
adapter1 = new YourListAdapter(getApplicationContext(),blabla); 
// set adapter into handler 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() {   
    @Override 
    public void run() { 
    // TODO Auto-generated method stub 
    mDrawerList.setAdapter(adapter1); 
    } 
}, 100); 

我把我的適配器來處理某個時候可以出現該適配器設置快於視圖,以便該代碼足以讓我解決了這個例外。:)

0

我設置

final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false); 
listView.addHeaderView(header, null, true); 

listView.setAdapter(adapter); 

仍然出現問題之前。然後我做了Build> Clean Project。