2012-07-15 7 views
14

Tengo un adaptador de lista que estoy tratando de establecer un xml personalizado para (item.xml) si no uso inflación (identificación directa de la vista de texto a través de un contexto de aplicación) , funciona perfectamente .. pero entonces mi vista de lista no puede ser temática ..Android - ClassCastException - en LayoutParams de 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; 

[..]

en logcat Estoy consiguiendo este ..

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) 

mi archivo item.xml es el siguiente:

<?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

puede alguien ayudar http://stackoverflow.com/questions/30951608/java-lang-classcastexception-android-view-viewgrouplayoutparams-cannot-be -cast – Aditya

Respuesta

33

El problema se debe a que envuelve el control que está devolviendo del adaptador en una distribución lineal. Pierda el LinearLayout de su archivo de diseño (simplemente coloque el TextView como la raíz) y creo que debería funcionar.

Expandir levemente: está creando su control y luego lo está agregando a LinearLayout. En este punto, se asigna un objeto LinearLayout $ LayoutParams y se configura como sus parámetros de diseño. A continuación, lo extrae del diseño lineal y lo coloca en su vista de lista, que no comprende LinearLayout $ LayoutParams.

O bien, devuelva la fila de getView en lugar de (como supongo que está haciendo en este momento, ya que ha cortado la línea de retorno de su código entre comillas) devolviendo la televisión.

(Otra pista no relacionada: está inflando su diseño y luego descartándolo cuando convertView! = Null; esto dará como resultado un rendimiento de desplazamiento deficiente en dispositivos lentos. Realice solo la inflación si realmente la va a necesitar.)

+0

¡sí! funcionó ... pero como dijiste, el desplazamiento es un poco desigual ... ¿cómo lo suavizo sin inflar? ¿Cómo puedo obtener un diseño personalizado para la lista sin inflarlo? y no entendí la parte de descartar ... ¿cómo se descarta?la fuente uri de esta lista es del mediatore .. –

+3

Gracias por este @Jules, ¡ayudó a entender el problema! Otra cosa que puede hacer si todavía desea utilizar el objeto de televisión es establecer sus parámetros de diseño para que sean una instancia de AbsListView.LayoutParams, es decir: tv.setLayoutParams (new AbsListView.LayoutParams (ancho, alto); –

+0

" Alternativamente, devuelva la fila de getView en lugar de (como supongo que está haciendo en este momento, ya que ha cortado la línea de retorno de su código entre comillas) devolviendo la televisión. "Eso funcionó como un amuleto. Gracias. – ElaGorilaki

0

Una forma correcta de trabajar con getView de ArrayAdapter para su código es la siguiente:

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

Además, no manualmente la basura se acumulan en su código si posible.

+0

no, sigue recibiendo el mismo error. si pongo ** tv = new TextView (mContext.getApplicationContext()); ** en la instrucción if, solo entonces está funcionando pero no está procesando mi archivo xml requerido ... –

5

¿Intentó utilizar el inflador de diseño para inflar el diseño estático de xml? De esta forma:

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

no, lo siento ... no puedo entender por qué pero es sigue mostrando el mismo error. –

20

que probablemente está devolviendo la televisión en lugar de la 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

Ésta es la correcta:

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

que tenía el mismo problema y he usado estos códigos:

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; 
} 
Cuestiones relacionadas