2012-09-29 8 views
8

Mam wyjątek, nigdy nie myślałem, że zobaczę. Odejście od klasy adaptera podczas usuwania widoku stopki z ListView (sic).Wyjątek rzutowania klasy adaptera podczas usuwania widoku Footer?

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

Jak to się dzieje? Co usunięcie stopki ma związek z wyjątkiem odlewania klasy ????

Lista jest adaptowana do wielu list, być może dlatego, ale nadal jest wyjątkiem klasy rzutowania dla usuwania stopki (sic).

Odpowiedz

12

Dodaj widok stopki do ListView przed wywołaniem metody setAdapter().

Dodano:

public void addFooterView (View v) 

od: API Level 1 Dodaj stały pogląd pojawiają się na dole listy. Jeśli funkcja addFooterView zostanie wywołana więcej niż raz, widoki pojawią się w kolejności, w jakiej zostały dodane. Widoki dodane za pomocą tej rozmowy mogą skupić się, jeśli chcą.

UWAGA: Zadzwoń do tego przed wywołaniem setAdapter. W ten sposób ListView może zawinąć dostarczony kursor na taki, który będzie również uwzględniał widoki nagłówka i stopki.

Parametry v Widok do dodania.

Source

Ponadto można sprawdzić ten interesting post.

Mam nadzieję, że to pomoże.

+0

wiesz dlaczego może wystąpić wyjątek klasa obsada? –

+0

Mam zaktualizowaną odpowiedź z tego interesującego posta http://stackoverflow.com/questions/4393775/android-classcastexception-when-adding-a-header-view-to-expandablelistview Myślę, że to odpowie na twoje pytanie. –

+0

@CodeDroid, jeśli znalazłeś poprawną odpowiedź, czy możesz ją zaakceptować. Dzięki –

9

To jest jakiś kod na odpowiedź powyżej, to zadziałało w moim przypadku:

musiałem ustawić footerView (jest to loadingView w ListView z paginacji) do mojego ListView przed ustawieniem to adapter, a następnie usunąć go . Najpierw inicjowana mój loadingView z pliku układu w metodzie OnCreate:

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

Następnie użyłem tego obejścia w ten sam sposób:

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

Gdzie

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

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

To także zakończyło się dla mnie. Ustaw nagłówek/stopkę, zainicjuj adapter, a następnie usuń nagłówek/stopkę. – wblaschko

+0

Ponowne wywoływanie setAdapter po dodaniu nagłówka/stopki powoduje, że ta poprawka działa –

+0

Czy przed dodaniem stopki możesz również użyć 'listView.getAdapter()! = Null'? – ono

1

Problem nie przyjdzie od removeFooterView(), ale od addFooterView(). Jeśli czytać dokumentację, stwierdza, że ​​owijka zostanie dodany do adaptera:

Jeśli adapter ListView nie powoduje przedłużenia HeaderViewListAdapter, zostanie owinięty nośnej instancji WrapperListAdapter.

W ten sposób należy użyć modułu pobierającego do pobrania zapakowanego adaptera i przesłać go do adaptera.W ten sposób:

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

Mam nadzieję, że pomoże to w rozwiązaniu problemu.

poważaniem,

0

dodając do innych odpowiedzi, jeśli dodawania/usuwania stopki dynamicznie (takich jak dotrą do dołu listy, a następnie dodajesz widok stopki) najłatwiej jest przesłonić setAdapter w swoim ListView i dodać nowy widok obiektu jak tam stopce, to upewnij się, że adapter jest owinięty w HeaderViewListAdapter:

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