2012-07-15 11 views
14

Ho un adattatore di lista che sto cercando di impostare un xml personalizzato per (item.xml) se non uso inflazione (identificando direttamente la vista testuale attraverso un contesto applicativo) , funziona perfettamente .. ma poi il mio ListView non può essere a tema ..Android - ClassCastException - su LayoutParams da LinearLayout a AbsListView

public View getView(int position, View convertView, ViewGroup parent) { 
     //System.gc(); 
     TextView tv; 

     LayoutInflater inflater = getLayoutInflater(); 

     View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either.. 
     String id = null; 
     if (convertView == null) { 
      tv = (TextView) row.findViewById(R.id.TextView01);; 
     } else 
      tv = (TextView) convertView; 

[..]

in logcat sto ottenendo questo ..

07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main 
     java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
     at android.widget.ListView.setupChild(ListView.java:1827) 
     at android.widget.ListView.makeAndAddView(ListView.java:1794) 
     at android.widget.ListView.fillDown(ListView.java:688) 

mio file item.xml è la seguente:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_height="wrap_content" 
      android:gravity="left|center" 
      android:layout_width="fill_parent" 
      android:paddingBottom="15px" 
      android:background="#fff200" 
      android:paddingTop="15px" 
      android:paddingLeft="15px"> 

<TextView android:id="@+id/TextView01" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="40px" 
      android:textStyle="bold" 
      android:layout_marginLeft="20px" 
      android:textColor="#0099CC"> 
</TextView> 
</LinearLayout> 
+0

può qualsiasi aiuto http://stackoverflow.com/questions/30951608/java-lang-classcastexception-android-view-viewgrouplayoutparams-cannot-be -cast – Aditya

risposta

33

Il problema è causato dal wrapping del controllo che si sta restituendo dall'adattatore in una visualizzazione lineare. Perdi LinearLayout dal tuo file di layout (basta mettere TextView come root) e penso che dovrebbe funzionare.

Per espandere leggermente: si sta creando il controllo e quindi aggiungendolo in un LinearLayout. A questo punto un oggetto LinearLayout $ LayoutParams viene assegnato per esso e impostato come parametri di layout. Quindi lo estrae dal layout lineare e lo metti nella visualizzazione elenco, che non comprende i LayoutParam $ LinearLayout.

In alternativa, restituire la riga da getView anziché (come presumo si stia facendo al momento, poiché si è tagliata la linea di ritorno dal codice quotato) restituendo la tv.

(Un altro suggerimento non correlato: si sta gonfiando il layout e poi lo si elimina quando convertView!)

+0

sì! ha funzionato .. ma come hai detto tu, lo scrolling è un po 'a scatti .. come posso lisciarlo senza fare inflazione? come in come ottengo un layout personalizzato per la lista senza gonfiarlo? e non ho capito la parte scartare .. come viene scartata?la fonte uri di questa lista proviene dal mediastore .. –

+3

Grazie per questo @Jules, ha aiutato a capire il problema! Un'altra cosa che si può fare se si vuole ancora utilizzare l'oggetto tv è quello di impostare i params di layout di essere un esempio di AbsListView.LayoutParams, vale a dire: tv.setLayoutParams (nuove AbsListView.LayoutParams (larghezza, altezza); –

+0

" In alternativa, restituisci row da getView piuttosto che (come presumo tu stia facendo al momento, dato che hai tagliato la linea di ritorno dal tuo codice quotato) restituendo tv. "Funzionava come un charm.Thanks. – ElaGorilaki

0

Un modo corretto di lavorare con GetView del ArrayAdapter per il codice è questo:

public View getView(int position, View convertView, ViewGroup parent) { 
    //System.gc(); // Should not manually call gc 
    View row; 
    LayoutInflater inflater = getLayoutInflater(); 
    if (convertView == null) { 
     row = inflater.inflate(R.layout.item, parent, false); 
    } else 
     row = convertView; 

    TextView tv = (TextView) row.findViewById(R.id.TextView01); 

Inoltre, non manualmente Garbage Collect nel codice, se possibile.

+0

no, continuando a ottenere lo stesso errore. se metto ** tv = nuovo TextView (mContext.getApplicationContext()); ** nella dichiarazione if, solo allora funziona ma non rende il mio file xml richiesto .. –

5

Hai provato a utilizzare il dispositivo di gonfiaggio del layout per gonfiare il layout statico xml? In questo modo:

LayoutInflater li = LayoutInflater.from(context); 
View rootView = li.inflate(R.layout.item, null); 
+0

no, scusa .. non riesco a capire perché, ma il suo ancora mostrando lo stesso errore .. –

20

probabilmente si restituisce la tv invece di fila

public View getView(int position, View convertView, ViewGroup parent) { 
    TextView tv; 

    LayoutInflater inflater = getLayoutInflater(); 
    View row = View.inflate(mContext,R.layout.item,null); 
    String id = null; 
    if (convertView == null) { 
     tv = (TextView) row.findViewById(R.id.TextView01);; 
    } else 
     tv = (TextView) convertView; 
    } 
return row; // returning tv brings to ClassCast! 
0

questa è la corretta:

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    final ViewHolder holder; 

    if(view==null){ 
     vi = inflater.inflate(R.layout.listview_row_myvideos,null); 
     holder = new ViewHolder(); 
     holder.tv = (TextView) vi.findViewById(R.id.TextView01); 

     vi.setTag(holder); 
    }else{ 
     holder = (ViewHolder)vi.getTag(); 
    } 
    return vi; 
} 

public class ViewHolder{ 
    TextView tv; 
} 
0

Ho avuto lo stesso problema e ho usato questi codici:

public View getView(final int position, View convertView, ViewGroup parent) { 
    convertView = G.layoutInflater.inflate(R.layout.list_lay_cities_markets, null); 

    // your work 

    notifyDataSetChanged(); 
    return convertView; 
} 
Problemi correlati