tutorial studio llenar ejemplo custom activity android listview adapter android-adapterview

android - studio - Error de Logcat: "addView(View, LayoutParams) no es compatible con AdapterView" en un ListView



listview android studio (4)

Regla de oro

Siempre debe intentar pasar un elemento primario mientras se infla una Vista, de lo contrario, el marco no podrá identificar qué parámetros de diseño usar para esa vista inflada.

La forma correcta de manejar la excepción es pasar falso como tercer parámetro , este indicador indica si una vista debe agregarse directamente al contenedor pasado o no.

En el caso de un adaptador, el adaptador agregará la vista una vez que haya devuelto la vista desde su método getview:

view = inflater.inflate (R.layout.mylayout, parent, false );

La muestra BaseAdapter , proviene de DevBytes para nosotros :

@Override public View getView(int position, View convertView, ViewGroup parent) { View result = convertView; if (result == null) { result = mInflater.inflate(R.layout.grid_item, parent, false); } // Try to get view cache or create a new one if needed ViewCache viewCache = (ViewCache) result.getTag(); if (viewCache == null) { viewCache = new ViewCache(result); result.setTag(viewCache); } // Fetch item Coupon coupon = getItem(position); // Bind the data viewCache.mTitleView.setText(coupon.mTitle); viewCache.mSubtitleView.setText(coupon.mSubtitle); viewCache.mImageView.setImageURI(coupon.mImageUri); return result; }

Muestra CursorAdapter :

@Override public View newView(final Context context, final Cursor cursor, final ViewGroup root) { return mInflater.inflate(R.layout.list_item_ticket, root, false); }

Se puede encontrar más información sobre la inflación de la vista en este doubleencore.com/2013/05/layout-inflation-as-intended .

Estoy haciendo una aplicación para Android y algo que necesito es que muestre una lista de todos los archivos y directorios en la tarjeta SD y tiene que poder moverse por los diferentes directorios. Encontré un buen tutorial en anddev . Modifiqué algunas cosas para que la aplicación se mueva en la tarjeta SD y no en los directorios raíz de Android, pero el resto es prácticamente el mismo.

Este es mi archivo xml para la actividad:

<?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ListView>

Y este es el código para la actividad:

import hackreatorz.cifrador.R; import java.io.File; import java.util.ArrayList; import android.app.ListActivity; import android.content.res.Configuration; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class ArchivosSD extends ListActivity { private ArrayList<String> directoryEntries = new ArrayList<String>(); private File currentDirectory = new File("/sdcard/"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); browseToSD(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } private void browseToSD() { browseTo(new File("/sdcard/")); } private void upOneLevel() { if(this.currentDirectory.getParent() != null) this.browseTo(this.currentDirectory.getParentFile()); } private void browseTo(final File directory) { if (directory.isDirectory()) { this.currentDirectory = directory; fill(directory.listFiles()); } else { Toast.makeText(ArchivosSD.this, this.directoryEntries.get(this.getSelectedItemPosition()), Toast.LENGTH_SHORT).show(); } } private void fill(File[] files) { this.directoryEntries.clear(); this.directoryEntries.add(getString(R.string.current_dir)); if(this.currentDirectory.getParent() != null) this.directoryEntries.add(getString(R.string.up_one_level)); int currentPathStringLength = (int) this.currentDirectory.getAbsoluteFile().length(); for (File file : files) { this.directoryEntries.add(file.getAbsolutePath().substring(currentPathStringLength)); } setListAdapter(new ArrayAdapter<String>(this, R.layout.archivos_sd, this.directoryEntries)); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { int selectionRowID = (int) this.getSelectedItemPosition(); String selectedFileString = this.directoryEntries.get(selectionRowID); if (selectedFileString.equals(".")) { this.browseToSD(); } else if(selectedFileString.equals("..")) { this.upOneLevel(); } else { File clickedFile = null; clickedFile = new File(this.currentDirectory.getAbsolutePath() + this.directoryEntries.get(selectionRowID)); if(clickedFile != null) this.browseTo(clickedFile); } } }

No recibo ningún error en Eclipse, pero obtengo un cierre forzado cuando ejecuto la aplicación en mi teléfono y cuando miro Logcat veo lo siguiente:

01-01 23: 30: 29.858: ERROR / AndroidRuntime (14911): EXCEPCIÓN FATAL: principal 01-01 23: 30: 29.858: ERROR / AndroidRuntime (14911): java.lang.UnsupportedOperationException: addView (View, LayoutParams) no es compatible con AdapterView

No tengo ni idea de qué hacer, busqué en Google y no encontré nada, e hice lo mismo en stackoverflow. Esta es mi primera aplicación en Java y para Android, así que soy un n00b real y si la respuesta estuviera allí, no lo entendí, así que realmente apreciaría que pudieras explicar qué debería hacer para solucionar este error y por qué.

Gracias por todo de antemano.


Al crear un ArrayAdapter como el suyo, ArrayAdapter necesita un recurso de diseño que contenga solo un TextView. Intente cambiar su creación de ArrayAdapter con:

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, this.directoryEntries));

y mira si funciona


Eliminar TextView de ListView en su archivo XML


Para otros que tienen este problema y han inflado un diseño en ArrayAdapter de getView , establezca el parámetro parent en null , como en view = inflater.inflate(R.layout.mylayout, null);