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:
- GridView con el botón del menú del filtro en Android
- RequestLayout () incorrectamente llamado por android.widget.RelativeLayout android
- El tipo nuevo AdapterView.OnItemClickListener () {} debe implementar el método abstracto heredado AdapterView.OnItemClickListener)
- IsItemChecked siempre devuelve lo contrario de lo que se supone que cuando dentro de un onItemClickListener?
- RemoveView (View) no es compatible con AdapterView
<?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.
- GridView.setOnItemClickListener no funciona
- Android AdapterView?
- Androide. ¿Cómo funciona el método notifyDataSetChanged () y ListViews?
- Extensión de AdapterView
- Diferencia entre onItemClickListener y OnItemSelectedListener de AdapterView
- ¿Qué significa AdapterView <?> En el método OnitemClick ()? ¿Cuál es el uso de otros parámetros en ella?
- MultiAutoCompleteTextView no funciona OnItemSelectedListener
- Manera correcta de implementar onMeasure () y onLayout () en AdapterView personalizado
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 .
- Cómo configurar url en WebView desde un archivo de diseño xml en Android?
- Cómo trasladarse a Android desde J2ME