webentwicklung-frage-antwort-db.com.de

Logcat-Fehler: "AddView (View, LayoutParams) wird in AdapterView nicht unterstützt" in einer ListView

Ich mache eine Anwendung für Android und etwas, was ich brauche, ist, dass eine Liste aller Dateien und Verzeichnisse auf der SD-Karte angezeigt wird und dass es in der Lage sein muss, sich durch die verschiedenen Verzeichnisse zu bewegen. Ich habe ein gutes Tutorial in anddev gefunden. Ich habe ein paar Dinge geändert, so dass sich die Anwendung auf der SD-Karte und nicht in Android-Stammverzeichnissen bewegt. Der Rest ist jedoch größtenteils derselbe.

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 das 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 erhalte eine Force Close, wenn ich die Anwendung auf meinem Telefon laufe. Wenn ich Logcat anschaue, sehe ich Folgendes:

01-01 23: 30: 29.858: FEHLER/AndroidRuntime (14911): FATALE AUSNAHME: main01-01 23: 30: 29.858: FEHLER/AndroidRuntime (14911): Java.lang.UnsupportedOperationException : addView (View, LayoutParams) wird in AdapterView nicht unterstützt

Ich habe keine Ahnung, was ich tun soll, ich habe in Google nachgeschlagen und nichts gefunden, und ich habe das gleiche bei stackoverflow getan. Dies ist meine erste Anwendung in Java und für Android, also bin ich ein echter n00b und wenn die Antwort da wäre, habe ich sie nicht verstanden. Ich würde es wirklich begrüßen, wenn Sie mir erklären könnten, was ich tun sollte, um diesen Fehler zu beheben und warum.

Vielen Dank für alles im Voraus.

33
Alberto Elias

Wenn Sie einen ArrayAdapter erstellen, benötigt der ArrayAdapter eine Layoutressource, die nur eine TextView enthält. Ändern Sie Ihre ArrayAdapter-Erstellung mit:

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

und sehen, ob es funktioniert.

14
Ander Webbs

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

67
Rose Perrone

Faustregel

Sie sollten immer versuchen, ein übergeordnetes Element zu übergeben, während Sie eine Ansicht vergrößern. Andernfalls kann das Framework nicht ermitteln, welche Layoutparameter für diese aufgeblähte Ansicht verwendet werden sollen. 

Der korrekte Weg zur Behandlung der Ausnahmebedingung besteht darin, false als dritten Parameter zu übergeben. Dieses Flag gibt an, ob eine Ansicht direkt zum übergebenen Container hinzugefügt werden soll oder nicht. 

Im Falle eines Adapters 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, false);

BaseAdapter sample, kommt aus nur für uns 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 sample: 

    @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 Inflationsrate finden Sie in diesem Artikel .

60
Tobrun

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

0
Harit Dahiya

mein Problem war das: Ich überschreibe getView in arrayAdapter. Als ich dann die Ansicht aufgeblasen habe, habe ich vergessen, attach to root auf false zu setzen und das hat diese Ausnahme verursacht.

so muss es gemacht werden:

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

nachdem das problem gelöst ist!

0
Hossein Karami