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;
[..]
- ¿Cómo evitar recrear Fragment en ViewPager?
- Añadir elementos a ListView - Android
- Desplazamiento síncrono de un encabezado ListView parcial
- Creando un appwidget android ListView for SDK 8?
- Aumentar dinámicamente el número de elementos en una vista de lista
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>
- Centrarse en EditText en ListView cuando los descendientes de bloque (Android)
- ListView parpadea cuando se le agregan nuevos elementos
- Sincronizar 2 ListViews desplazándose
- Horizontal listView con 1 elemento visible a la vez
- EditText en ListView es actualizado por onTextChanged al desplazarse
- ListView.getCheckedItemPositions no puede devolver elementos marcados en SparseBooleanArray
- Android: eliminar el divisor de algunos listitems en listview
- Actualización de datos de Json analizados en Listview
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; }
- Cómo borrar las vistas que se celebran en el ListView de RecycleBin?
- Cómo retrasar un bucle en android sin usar thread.sleep?