Android – ClassCastException – en LayoutParams de LinearLayout a AbsListView

Tengo un adaptador de lista que estoy tratando de establecer un xml personalizado para (item.xml) si no uso la inflación (identificación directa de la textview a través de un contexto de aplicación), funciona perfectamente .. pero luego mi listview no puede ser temática

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 recibiendo esto ..

  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 como sigue:

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

El problema se debe a que se envuelve el control que está retornando desde el adaptador en un linearlayout. Perder el LinearLayout de su archivo de diseño (sólo poner el TextView como la raíz) y creo que debería funcionar.

Para expandir ligeramente: está creando su control, y luego agregarlo a LinearLayout. En este punto, un objeto LinearLayout $ LayoutParams se asigna para ello y se define como sus parámetros de diseño. A continuación, extraerlo del diseño lineal y ponerlo en su vista de lista, que no entiende el LinearLayout $ LayoutParams.

Alternativamente, devolver 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 citado) devolviendo tv.

(Otra sugerencia no relacionada: se está inflando su diseño y luego se descarta cuando convertView! = Null, lo que resultará en un rendimiento de desplazamiento deficiente en los dispositivos lentos. Sólo realizar la inflación si realmente va a necesitar.

es probable que vuelva la televisión en lugar de 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! 

¿Intentaste usar el inflador de diseño para inflar el diseño xml estático? Me gusta esto:

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

Una manera adecuada de trabajar con el getView de ArrayAdapter para su código es:

 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 recoja manualmente la basura en su código si es posible.

Este es el correcto:

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

Tuve el mismo problema y he utilizado 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; } 
  • Android restore instance state de un fragmento que está en backstack
  • Lista de preferencias sólo muestra el primer elemento
  • El elemento ListView no extenderá el ancho a fill_parent
  • ¿Cómo puedo obtener un elemento ListView para ser elevado?
  • Reutilización de vistas en Android Listview con 2 diseños diferentes
  • Inverted ListView en Android?
  • Filtrado de datos listView utilizando SimpleAdapter
  • Android -El contenido del adaptador ha cambiado pero ListView no recibió una notificación
  • En Android cómo cambiar el color de una letra / carácter en particular que se está buscando dentro de la lista
  • ¿Cómo puedo crear un ListView con divisiones de línea punteadas / punteadas en Android?
  • ListView con Viewpager como un encabezado dentro de TabPageIndicator
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.