2010-12-09 65 views
36

我添加了一個以listVivew的頭時,ClassCastException異常與ListView控件執行notifyDataSetChanged

View TopSearch = (View) View.inflate(this, R.layout.search, null); 
    lv.addHeaderView(TopSearch, null, false); 

,一切都很好,直到我試圖執行(當數據發生變化)

adapter.notifyDataSetChanged(); 

總是崩潰我的應用程序給我以下錯誤:

> java.lang.ClassCastException:android.widget.HeaderViewListAdapter

如果我刪除標題視圖然後沒有錯誤。有什麼建議麼?謝謝。

+0

您需要使用`ListView.LayoutParams`。 檢查[這個問題] [1]。 [1]:http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview/4401369#4401369 – Macarse 2011-10-14 17:48:26

回答

-2
public class YourOwnList extends ListActivity { 
    private EfficientAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     mAdapter = new EfficientAdapter(/*your parameters for the adapter*/); 
    } 

    private void yourMethod() { 
     mAdapter.notifyDataSetChanged(); 
    } 

    private static class EfficientAdapter extends CursorAdapter { 
     // your adapter 
    } 
} 
+2

歡迎StackOverflow的。總是建議添加一行或兩行關於您發佈的代碼,它可以幫助其他成員更好地理解您的代碼 – Vivek 2012-10-28 18:20:24

123

看來,無論何時在listview中使用header/footer視圖,ListView都會被HeaderViewListAdapter包裹。您可以使用以下代碼修復此問題:

((YourAdapter)((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter()).notifyDataSetChanged(); 
+2

我的`listView.getAdapter()`不是`HeaderViewListAdapter`的實例,在頁腳視圖之後添加。 – ono 2015-03-03 22:00:32

+0

非常感謝。由於我的應用程序的結構,我無法遵循下面的方法 – rahulinaction 2015-03-22 13:45:00

12

API 18和更低版本會對它正在包裝的內容感到困惑。爲了幫助它,請將頁眉和/或頁腳設置爲分配適配器。這樣正確的包裝發生在封面之下。然後立即刪除頁眉/頁腳(如果這是你想要的)。

myList.addFooterView(myFooterView); 
myList.setAdapter(adapter); 
myList.removeFooterView(myFooterView); 
0

@ mussharapp的答案是完全正確的,它的工作原理!但是我覺得更方便簡單的緩存,供以後使用一個成員變量適配器的時候做setAdapter()之前:

mAdapter = new YourAdapter(ctx, items); 
listView.addFooterView(v); 
listView.setAdapter(mAdapter); 
0

的類轉換異常的原因是listview沒有包裝到headerlistview。所以我們不能直接添加頁腳或標題到列表視圖。因此,在將適配器設置爲列表視圖之前,請將啞視圖添加爲頁眉或頁腳視圖。然後將適配器設置爲listview。這使listview實例成爲headerviewslist的實例。然後,您可以像平常一樣輕鬆地在列表視圖中添加和刪除頁腳。

listview.addFooterView(new View(mContext));listview.setAdapter(yourAdapter): 

設置適配器後,可以添加或刪除頁腳 listview.addFooterView(yourFooter);或listview.removeFooterView(yourFooter);