web-dev-qa-db-fra.com

Erreur Logcat: "addView (View, LayoutParams) n'est pas pris en charge dans AdapterView" dans un ListView

Je fais une application pour Android et ce dont j'ai besoin, c’est qu’elle affiche une liste de tous les fichiers et répertoires de la carte SD et qu’elle doit pouvoir se déplacer dans les différents répertoires. J'ai trouvé un bon tutoriel dans anddev . J'ai modifié quelques éléments pour que l'application se déplace dans la carte SD et non dans les répertoires racine d'Android, mais le reste est pratiquement identique.

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 aucune erreur dans Eclipse, mais je reçois une fermeture forcée lors de l'exécution de l'application sur mon téléphone. Lorsque je regarde Logcat, les éléments suivants apparaissent:

01-01 23: 30: 29.858: ERREUR/AndroidRuntime (14911): EXCEPTION FATALE: main01-01 23: 30: 29.858: ERREUR/AndroidRuntime (14911): Java.lang.SupportéExploitation : addView (View, LayoutParams) n'est pas pris en charge dans AdapterView

Je ne sais pas quoi faire, j'ai consulté Google, je n'ai rien trouvé et j'ai fait de même avec stackoverflow. Ceci est ma première application en Java et pour Android donc je suis un vrai n00b et si la réponse était là, je ne le comprenais pas, alors je vous serais reconnaissant de bien vouloir expliquer ce que je devrais faire pour corriger cette erreur et pourquoi.

Merci pour tout à l'avance.

33
Alberto Elias

Lors de la création d'un ArrayAdapter comme le vôtre, ArrayAdapter a besoin d'une ressource de présentation contenant uniquement un TextView. Essayez de modifier votre création ArrayAdapter avec:

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

et voir si ça marche.

14
Ander Webbs

Pour les autres personnes ayant ce problème et ayant gonflé une présentation dans ArrayAdapter 's getView, définissez le paramètre parent sur null, comme dans view = inflater.inflate(R.layout.mylayout, null);

67
Rose Perrone

Règle de base

Vous devez toujours essayer de passer un parent lorsque vous gonflez une vue, sinon le framework ne pourra pas identifier les paramètres de présentation à utiliser pour cette vue gonflée. 

La méthode correcte de gestion de l'exception consiste à passer false en tant que troisième paramètre. Cet indicateur indique si une vue doit être ajoutée directement au conteneur transmis ou non. 

Dans le cas d'un adaptateur, l'adaptateur lui-même ajoutera la vue après que vous ayez renvoyé la vue depuis votre méthode getview: 

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

BaseAdapter sample provient de DevBytes juste pour nous :

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

Vous trouverez plus d’informations sur l’inflation de la vue dans cet article article .

60
Tobrun

Supprimer TextView De ListView dans votre fichier XML

0
Harit Dahiya