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