2011-01-01 6 views
27

Ich mache eine Anwendung für Android und etwas, das ich brauche, ist, dass es eine Liste aller Dateien und Verzeichnisse auf der SD-Karte und zeigt Es muss in der Lage sein, sich durch die verschiedenen Verzeichnisse zu bewegen. Ich habe a good tutorial in anddev gefunden. Ich habe ein paar Dinge geändert, also bewegt sich die Anwendung auf der SD-Karte und nicht in Android-Root-Verzeichnissen, aber der Rest ist meistens derselbe.Logcat Fehler: "AddView (Ansicht, LayoutParams) wird in AdapterView nicht unterstützt" in einem ListView

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 ein Erzwinge Schließen beim Ausführen der Anwendung auf meinem Telefon und wenn ich Logcat ansehe, sehe ich folgendes:

01-01 23: 30: 29.858: FEHLER/AndroidRuntime (14911): FATALE AUSNAHME: main 01-01 23: 30: 29,858: ERROR/Android Runtime (14911): java.lang.UnsupportedOperationException: addView (Ansicht, LayoutParams) nicht

in AdapterView unterstützt

Ich habe keine Ahnung, was zu tu, ich habe in Google nachgeschaut und habe nichts gefunden und das gleiche habe ich bei stackoverflow gemacht. Dies ist meine erste Anwendung in Java und für Android, also bin ich ein echtes n00b und wenn die Antwort da war, 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.

Vielen Dank für alles im Voraus.

Antwort

14

Wenn Sie einen ArrayAdapter wie Ihren erstellen, benötigt der ArrayAdapter eine Layout-Ressource , die nur eine TextView enthält. Versuchen Sie, Ihre ArrayAdapter Schöpfung Wechsel mit:

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

und sehen, ob es funktioniert.

+0

Großartig! Es funktioniert, vielen Dank! Ich zweifle an Ihrer Antwort, was beinhaltet "android.R.layout.simple_list_item_1"? Wenn ich "android.R.layout.simple_list_item_1" verwende, was passiert mit dem Layout, das ich mit einer Listview und einer Textansicht gemacht habe? Danke vielmals! –

+0

Wenn Sie einen ArrayAdapter erstellen, übergeben Sie eine Layout-Ressource, die für jedes Listenelement verwendet werden soll (und ArrayAdapter benötigt nur eine TextView). Die Layout-Datei, in der Sie den "Bildschirm" einrichten, soll in onCreate mit setContentView (R.layout.Ihr_layout) verwendet werden. –

+0

Could I "android.R.layout.simple_list_item_1" zu R.layout.myxml ändern, wenn die XML-Datei den folgenden Code hat ?: \t

58

andere für das dieses Problem haben und haben ein Layout in ArrayAdapter ‚s getView, stellen Sie die parent Parameter auf null aufgeblasen, wie in view = inflater.inflate(R.layout.mylayout, null);

+3

Great comment! Ich habe deswegen stundenlang zu kämpfen ... Wer weiß warum? –

+0

Das hat auch mein Problem behoben. Ich denke, dass es etwas mit listview parent zu tun hat, das Layoutparameter benötigt. – jtwigg

+12

Dies ist definitiv eine falsche Antwort, Sie sollten immer eine Eltern-Viewgroup beim Aufblasen, es gibt einige Ausnahmen, aber das ist nicht einer von ihnen, für weitere Informationen siehe hier: http://www.doubleencore.com/2013/05/ Layout-Inflation-wie beabsichtigt /. Das allgemeine Problem, das Leute haben, ist ein falsch konfiguriertes XML. – Tobrun

48

Daumenregel

Sie sollten immer versuchen, in einem passieren Beim Aufblasen einer View kann der Rahmen nicht erkennen, welche Layoutparameter für diese aufgeblähte Ansicht verwendet werden sollen.

Die korrekte Weise Ausnahme der Handhabung wird durch falsche als dritten Parameter Dieses Flag zeigt an, ob eine Ansicht hinzugefügt direkt an die Behälter übergeben werden soll oder nicht vorbei.

Im Falle eines Adapters, der Adapter selbst der Ansicht hinzufügen, nachdem Sie den Blick von Ihnen GetView Methode zurückgegeben:

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

BaseAdapter Probe stammt aus 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 Beispiel:

@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 über Ansicht Inflation kann in diesem article gefunden werden.

Verwandte Themen