Logcat -Fehler: „AddView (Ansicht, LayoutParams) wird in AdapterView nicht unterstützt“ in einem ListView

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

Frage

Ich mache eine Bewerbung für Android und etwas, das ich brauche, ist, dass sie eine Liste aller Dateien und Verzeichnisse in der SD -Karte anzeigt und in der Lage sein muss, die verschiedenen Verzeichnisse zu bewegen. ich fand Ein gutes Tutorial in und devev. Ich habe ein paar Dinge geändert, damit sich die Anwendung in der SD -Karte und nicht in Android -Root -Verzeichnissen bewegt, aber der Rest ist meistens der gleiche.

Dies ist meine XML -Datei für die Aktivität:

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

Und dies ist der Code für die Aktivität:

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

Ich bekomme keine Fehler in Eclipse, aber ich bekomme eine Kraft, die die Anwendung auf meinem Telefon ausführt, und wenn ich mir Logcat ansehe, sehe ich Folgendes:

01-01 23: 30: 29.858: Fehler/AndroidRuntime (14911): Fatale Ausnahme: Haupt 01-01 23: 30: 29.858: Fehler/AndroidRuntime (14911): java.lang.unsupportedoperationException: AddView (Ansicht, LayoutParams) wird in AdapterView nicht unterstützt

Ich habe keine Ahnung, was ich tun soll, ich habe in Google aufgeschaut und habe nichts gefunden und ich habe das gleiche bei Stackoverflow gemacht. Dies ist meine erste Leistung in Java und für Android, also bin ich ein echter N00B und wenn die Antwort da wäre, habe ich es nicht verstanden, also würde ich es wirklich schätzen, wenn Sie erklären könnten, was ich tun sollte, um diesen Fehler zu beheben und warum.

Danke für alles im Voraus.

War es hilfreich?

Lösung

Beim Erstellen eines Arrayadapter Wie Ihre benötigt der Arrayadapter eine Layout -Ressource enthalten nur eine Textansicht.Versuchen Sie, Ihre Arrayadapter -Kreation zu ändern mit:

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

und sehen, ob es funktioniert.

Andere Tipps

Für andere, die dieses Problem haben und ein Layout aufgeblasen haben ArrayAdapter's getView, setzen Sie die parent Parameter zu null, wie in view = inflater.inflate(R.layout.mylayout, null);

Faustregel

Sie sollten immer versuchen, ein Elternteil einzugeben, während Sie eine Ansicht aufblasen. Andernfalls kann das Framework nicht identifizieren, welche Layoutparameter für diese aufgeblasene Ansicht verwendet werden sollen.

Das der richtige Weg mit der Ausnahme zu handhaben, besteht FALSCH als dritter Parameter, Dieses Flag gibt an, ob eine Ansicht direkt zum übergebenen Container hinzugefügt werden soll oder nicht.

Bei einem Adapter fügt der Adapter selbst die Ansicht hinzu, nachdem Sie die Ansicht von Ihrer GetView -Methode zurückgegeben haben:

View = Inflater.inflate (R. Layout.Mylayout, Elternteil, FALSCH);

Basisadapter Probe kommt von Just-for-us avbytes:

    @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 Probe:

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

Weitere Informationen zur Ansichtsinflation finden Sie darin Artikel.

Löschen Sie TextView aus ListView in Ihrer XML -Datei

Mein Problem war Folgendes: Ich habe GetView in ArrayAdapter überschrieben. Dann, als ich die Ansicht aufgeblasen hatte, habe ich vergessen zu setzen an die Wurzel an False anhängen Und das verursachte diese Ausnahme.

So muss so gemacht werden:

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

Nach diesem Problem gelöst!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top