Domanda

Sto cercando di aggiungere un'intestazione a un ExpandableListView in questo modo:

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

Il che mi dà il seguente errore:

 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)

Questo sta accadendo alla chiamata a expandableListView.setAdapter(new SectionedAdapter(this)), ma non riesco a capire perché. Tutte le idee?

È stato utile?

Soluzione

Ok, ho capito questo fuori. Mi sono liberato del runtime error impostando programatically della vista LayoutParams a ListView LayoutParams, in questo modo:

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

prima di aggiungere la vista. L'essere ragione si trova nella documentazione Android:

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

in cui si afferma che:

  

Questi parametri di alimentazione al    genitori di questo punto di vista che specifica come dovrebbe essere organizzato. Ci sono molti   sottoclassi di ViewGroup.LayoutParams,   e questi corrispondono alle diverse   sottoclassi di ViewGroup che sono   responsabile per l'organizzazione loro   i bambini.

Quindi, fondamentalmente, se si aggiunge una vista ad un altro, è necessario impostare le LayoutParams della vista al tipo LayoutParams che gli usi genitore, o si otterrà un errore di runtime.

Altri suggerimenti

Anche se la risposta di cui sopra potrebbe funzionare per molti, c'è ancora una spiegazione migliore. ClassCastException è il comportamento normale dopo aver chiamato listview.addHeaderView o listview.addFooterView.

La ragione è che l'adattatore iniziale è avvolto nel HeaderViewListAdapter. Per ottenere il vostro adattatore di utilizzare questo codice.

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

codice preso da qui

Nel mio caso questo non ha funzionato. Ho dovuto impostare un footerView alla mia listView prima di esso dell'adattatore. Per prima cosa ho inizializzato il mio loadingView da un file di layout in metodo OnCreate:

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

Poi ho usato questa soluzione con lo stesso metodo:

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

Dove

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

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

Si dovrebbe mettere vista padre alla vista gonfiato.

ListView listview = (ListView) findViewById(R.id.listview);
headerView = View.inflate(this, R.layout.header, listview, false); // set listview as parent view
listview.addHeaderView(headerview);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top