Erreur Logcat: « addView (Voir, LayoutParams) ne sont pas pris en charge AdapterView » dans un ListView

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

Question

Je fais une application pour Android et quelque chose que je besoin est qu'il affiche une liste de tous les fichiers et répertoires de la carte SD et il doit pouvoir se déplacer à travers les différents répertoires. J'ai trouvé un bon tutoriel en anddev . Je l'ai modifié quelques petites choses pour que l'application se déplace dans la carte SD et non pas dans les répertoires racine Android, mais le reste est la plupart du temps la même chose.

Ceci est mon fichier xml pour l'activité:

    <?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>

Et voici le code de l'activité:

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

Je ne reçois pas d'erreurs dans Eclipse, mais je reçois une force Close lors de l'exécution de l'application sur mon téléphone et quand je regarde Logcat je vois ce qui suit:

01-01 23: 30: 29,858: ERREUR / AndroidRuntime (14911): FATAL EXCEPTION: principal 01-01 23: 30: 29,858: ERREUR / AndroidRuntime (14911): java.lang.UnsupportedOperationException: addView (Voir, LayoutParams) ne sont pas pris en charge dans AdapterView

Je n'ai pas la moindre idée quoi faire, je l'ai regardé dans Google et je ne trouve rien et je l'ai fait la même chose à stackoverflow. Ceci est mon premier aplication en Java et pour Android, donc je suis un vrai n00b et si la réponse était là, je ne comprenais pas si je serais vraiment reconnaissant si vous pouviez expliquer ce que je dois faire pour corriger cette erreur et pourquoi.

Merci pour tout à l'avance.

Était-ce utile?

La solution

Lors de la création d'un ArrayAdapter comme le vôtre, le ArrayAdapter a besoin d'une ressource de mise en page contenant juste un TextView. Essayez de changer la création de votre ArrayAdapter avec:

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

et voir si cela fonctionne.

Autres conseils

Pour d'autres qui ont ce problème et ont gonflé une mise en page dans ArrayAdapter de getView, définissez le paramètre parent à null, comme dans view = inflater.inflate(R.layout.mylayout, null);

Règle générale

Vous devez toujours essayer de passer dans un parent tout en gonflant une vue, sinon le cadre ne sera pas en mesure d'identifier ce layout params à utiliser pour ce point de vue gonflé.

La façon dont correcte de gérer l'exception est en passant false en tant que troisième paramètre , ce drapeau indique si une vue doit être directement ajouté à le récipient passé ou non.

Dans le cas d'un adaptateur, l'adaptateur lui-même ajouter la vue après avoir retourné la vue de vous getView méthode:

  

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

BaseAdapter échantillon, vient de juste des fins de transaction nous 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 Exemple:

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

Plus d'informations sur l'inflation vue se trouve dans cette article .

Supprimer TextView De ListView dans votre fichier XML

mon problème était le suivant: je passer outre getView dans arrayAdapter. puis quand je vue gonflé, j'ai oublié de jeu attach à la racine false et qui a provoqué cette exception.

comment doit être fait:

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

après avoir résolu ce problème!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top