44

ben şöyle bir ExpandableListView için bir başlık eklemek için çalışıyorum:Android: Başlık görünümü eklerken ExpandableListView için ClassCastException

12-08 16:23:42.354: 
ERROR/AndroidRuntime(421): Caused by:java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams 
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.clearRecycledState(ListView.java:504) 
12-08 16:23:42.354: ERROR/AndroidRuntime(421): at android.widget.ListView.resetList(ListView.java:490) 
12-08 16:23:42.354:ERROR/AndroidRuntime(421):at android.widget.ListView.setAdapter(ListView.java:422) 
12-08 16:23:42.354:ERROR/AndroidRuntime(421): at android.widget.ExpandableListView.setAdapter(ExpandableListView.java:475) 

budur: bana aşağıdaki hata veriyor

headerView = View.inflate(this, R.layout.header, null); 
expandableListView.addHeaderView(headerView); 
expandableListView.setAdapter(new SectionedAdapter(this)); 

expandableListView.setAdapter(new SectionedAdapter(this)) numaralı telefondan aranıyor ama nedenini çözemiyorum. Herhangi bir fikir?

cevap

91

Tamam, bunu anladım. Programlama aynen böyle ListView LayoutParams için görünümün LayoutParams ayarlayarak çalışma zamanı hatası kurtuldum:

headerView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT)); 

görünümü eklemeden önce. Sebebi Android docs bulunur: devletler

http://developer.android.com/reference/android/view/View.html#setLayoutParams(android.view.ViewGroup.LayoutParams)

o: Başka bir görünüm ekliyorsanız temelde Yani

These supply parameters to the parent of this view specifying how it should be arranged. There are many subclasses of ViewGroup.LayoutParams, and these correspond to the different subclasses of ViewGroup that are responsible for arranging their children.

, sen bakış LayoutParams set GEREKİR Ebeveynin kullandığı LayoutParams türüne veya bir çalışma zamanı hatası alırsınız.

+3

Son iki saati harcamayı denedim. Teşekkürler! – Tenfour04

+1

Cevabı buraya gönderdiğiniz için teşekkür ederiz, çok yararlı! – AndersG

+0

Ne aptalca bir hata mesajı ... Zamandan tasarruf ettiğiniz için teşekkür ederiz! – SuitUp

1

Benim durumumda bu işe yaramadı. Bağdaştırıcısını ayarlamadan önce Listeme bir altbilgiViewView ayarlamak zorunda kaldı. Önce OnCreate yönteminde bir düzen dosyasından benim loadingView başlatıldı: Ben de aynı yöntemle bu geçici çözümü kullanılan Sonra

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); 

Nerede

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

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

bile yukarıdaki cevabı olsa Birçok kişi için işe yarayabilir, hala daha iyi bir açıklama var. listview.addHeaderView veya listview.addFooterView numaralı telefonlardan sonra ClassCastException normal davranıştır.

Bunun nedeni, başlangıç ​​bağdaştırıcısının HeaderViewListAdapter'a sarılmasıdır. Bağdaştırıcınızı almak için bu kodu kullanın.

YourAdapter ya = (YourAdapter) ((HeaderViewListAdapter)lv.getAdapter()).getWrappedAdapter(); 

Code taken from here

+0

Çözümünüz Christopher çözümü üzerinde çalıştı. Eğer Christopher'ın çözümü işe yaramazsa, bu adamları dene! –

0

Sen şişirilmiş görünümüne ana görünümünü koymak gerekir.

ListView listview = (ListView) findViewById(R.id.listview); 
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view 
listview.addHeaderView(headerview); 
İlgili konular