2012-09-29 23 views
8

我有一個例外,我從來沒有想過我會看到。當從ListView中移除頁腳視圖時,該類將轉換爲適配器的異常(原文如此)。刪除頁腳視圖時,適配器類轉換異常?

java.lang.ClassCastException: com.test.MyAdapter 
at android.widget.ListView.removeFooterView(ListView.java:381) 

這怎麼會發生?刪除頁腳與類轉換異常有什麼關係?

該列表是一個多列表適配器也許這就是爲什麼但仍然是一個類除去頁腳(sic)的強制異常。

回答

12

在致電setAdapter()方法之前,將您的頁腳視圖添加到ListView

補充:

public void addFooterView (View v) 

自:API等級1 添加一個固定視圖出現在列表的底部。 如果不止一次調用addFooterView,視圖將按照它們添加的順序出現。如果他們想要,使用此調用添加的視圖可以關注焦點。

注意:在調用setAdapter之前調用它。這是因爲ListView可以將提供的光標與一個也包含頁眉和頁腳視圖的光標包裝在一起。

參數 v要添加的視圖。你

Source

還可以檢查此interesting post

希望這有助於。

+0

你知道爲什麼會出現類轉換異常? –

+0

我已經更新了我的回答這個有趣的帖子http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview 我認爲這將回答你的問題。 –

+0

@CodeDroid如果你發現我的答案是正確的,你能否接受它。謝謝 –

9

這是上面的回答一些代碼,它在我的情況下工作:

我必須設置它的適配器之前設置一個footerView(這是與分頁列表視圖一個loadingView)我的ListView,然後將其刪除。首先,我在onCreate方法的佈局文件初始化我loadingView:

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
loadingView = layoutInflater.inflate(R.layout.loading_view, null); 

然後,我在同樣的方法使用此解決方法:

this.setIsLoading(true); 
listView.setAdapter(adapter); 
this.setIsLoading(false); 

private void setIsLoading(boolean isLoading) 
{ 
    this.isLoading = isLoading; 

    if (isLoading) { 
     listView.addFooterView(loadingView); 
    } 
    else { 
     listView.removeFooterView(loadingView); 
    } 
} 
+0

這也是爲我工作的結果。設置頁眉/頁腳,啓動適配器,然後刪除頁眉/頁腳。 – wblaschko

+0

添加頁眉/頁腳後再次調用setAdapter是爲什麼此修補程序可以工作 –

+0

在添加頁腳之前,您還可以執行'listView.getAdapter()!= null'嗎? – ono

1

問題不來來自removeFooterView(),但來自addFooterView()。 如果你閱讀文檔,它指出的包裝將被添加到您的適配器:

如果ListView的適配器不延長HeaderViewListAdapter,它將與WrapperListAdapter的支持實例包裹。

因此,您必須使用getter來檢索包裝好的適配器並將其轉換爲適配器。像這樣:

((MyAdapter) ((HeaderViewListAdapter) listView.getAdapter()).getWrappedAdapter()) 

希望這會幫助你解決你的問題。

最好的問候,

0

添加到其他的答案,如果您要添加/刪除動態頁腳(例如,如果他們達到你的列表的底部,然後你要添加一個頁腳視圖)最簡單的事情是覆蓋在你的ListViewsetAdapter並添加新的View對象作爲腳註出現,這將確保適配器被包裹在HeaderViewListAdapter

@Override 
public void setAdapter(ListAdapter adapter) { 
    addFooterView(new View(getContext())); 
    super.setAdapter(adapter); 
}