Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

Estoy haciendo una aplicación para Android y algo que necesito es que muestra una lista de todos los archivos y directorios en la tarjeta SD y tiene que ser capaz de moverse a través de los diferentes directorios. He encontrado un buen tutorial en anddev . He modificado algunas cosas para que la aplicación se mueva en la tarjeta SD y no en los directorios de la raíz de Android, pero el resto es mayormente el mismo.

Este es mi archivo xml para la actividad:

  • RemoveView (View) no es compatible con AdapterView
  • Cómo saber desde el adaptador si el elemento de ListView es visible o no?
  • <?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 obtengo ningún error en Eclipse, pero recibo un Force Close al ejecutar la aplicación en mi teléfono y cuando miro a Logcat veo lo siguiente:

    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 y hice lo mismo en stackoverflow. Esta es mi primera aplicación en Java y para Android por lo que soy un n00b real y si la respuesta estaba allí, no lo entendía así que realmente apreciaría si pudiera explicar lo que debo hacer para solucionar este error y por qué.

    Gracias por todo por adelantado.

  • ¿Cómo se especifica en AndroidManifest.xml que desea prohibir la instalación en dispositivos más pequeños que un dispositivo de 4,7 pulgadas?
  • Filtro de intenciones para descargar adjuntos de aplicaciones de gmail en Android
  • La interfaz de JavaScript no funciona con Android 4.2
  • Uso de SimpleXML con Android y Gradle
  • Cómo enviar caracteres unicode en un HttpPost en Android
  • EditText no desplazable dentro de ScrollView
  • 3 Solutions collect form web for “Error de Logcat: "addView (View, LayoutParams) no es compatible con AdapterView" en un ListView”

    Al crear un ArrayAdapter como el tuyo, el ArrayAdapter necesita un recurso de diseño que contenga sólo un TextView. Pruebe a cambiar la creación de ArrayAdapter con:

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

    Y ver si funciona.

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

    Regla de oro

    Siempre debe intentar pasar a un padre mientras infla una vista, de lo contrario el marco no será capaz de identificar qué params de diseño para utilizar para esa vista inflada.

    La manera correcta de manejar la excepción es pasar false 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 propio adaptador agregará la vista después de devolver la vista desde el método getview:

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

    BaseAdapter muestra, proviene de DevBytes just-for-us :

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

    CursorAdapter muestra:

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

    Más información sobre la inflación de la vista se puede encontrar en este artículo .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.