Error de logCat: "AddView (Ver, LayoutParams) no es compatible con AdapterView" en una vista de lista

StackOverflow https://stackoverflow.com/questions/4576219

Pregunta

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 que debe poder moverse a través de los diferentes directorios. encontré Un buen tutorial en y por. 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 principalmente 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 una fuerza cierre 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): Excepción fatal: Principal 01-01 23: 30: 29.858: Error/AndroidRuntime (14911): Java.lang.UnsupportedOperationException: AddView (Ver, LayoutParams) no es compatible con AdapterView

No tengo ni idea de qué hacer, he levantado la vista 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 verdadero N00B y si la respuesta estaba allí, no la entendí, así que realmente apreciaría si pudiera explicar qué debería hacer para corregir este error y por qué.

Gracias por todo de antemano.

¿Fue útil?

Solución

Al crear un Arrerayada Al igual que el tuyo, el ArrayAdapter necesita un recurso de diseño que contiene solo una vista text.Intente cambiar su creación de ArrayAdapter con:

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

y vea si funciona.

Otros consejos

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

Regla de oro

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

los forma correcta de manejar la excepción es pasando falso como tercero parámetro, esta bandera indica si se debe agregar una vista directamente al contenedor pasado o no.

En el caso de un adaptador, el adaptador en sí agregará la vista después de que devuelva la vista desde su método GetView:

ver = inflater.inflate (r.layout.mylayout, padre, falso);

BaseAdapter muestra, proviene de Just-For-Us Devbytes:

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

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

Eliminar TextView de ListView en su archivo XML

Mi problema fue este: anulé GetView en ArrayAdapter. Luego, cuando inflé la vista, olvidé establecer adjuntar a la raíz al falso Y eso causó esta excepción.

Así es como se debe hacer:

convertView = LayoutInflater.from(getContext()).inflate(R.layout.market_search_product_view, parent,false);

¡Después de ese problema resuelto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top