Errore di Logcat: “addView (Visualizza, LayoutParams) non è supportato in AdapterView” in un controllo ListView

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

Domanda

che sto facendo una domanda di Android e qualcosa che ho bisogno è che mostra un elenco di tutti i file e le directory nella scheda SD e deve essere in grado di muoversi attraverso le diverse directory. Ho trovato un buon tutorial in anddev . Ho modificato alcune cose per cui l'applicazione si muove nella scheda SD e non nelle directory di root Android, ma il resto è per lo più la stessa.

Questo è il mio file XML per l'attività:

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

E questo è il codice per l'attività:

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

Non capisco eventuali errori in Eclipse, ma ottengo una Forza chiudere quando si esegue l'applicazione sul mio telefono e quando guardo Logcat compaiono i seguenti:

01-01 23: 30: 29,858: ERRORE / AndroidRuntime (14911): eccezione irreversibile: main 01-01 23: 30: 29,858: ERRORE / AndroidRuntime (14911): java.lang.UnsupportedOperationException: addView (View, LayoutParams) non è supportato in AdapterView

Non ho la minima idea di cosa fare, ho cercato in Google e non ho trovato nulla e ho fatto lo stesso a StackOverflow. Questo è il mio primo aplication in Java e per Android, quindi sono un vero n00b e se la risposta era lì, non ho capito che così sarei davvero grato se potesse spiegare che cosa devo fare per correggere questo errore e perché.

Grazie di tutto in anticipo.

È stato utile?

Soluzione

Quando si crea un ArrayAdapter come la tua, l'ArrayAdapter ha bisogno di una risorsa di layout che contiene solo un TextView. Provare a cambiare la vostra creazione ArrayAdapter con:

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

e vedere se funziona.

Altri suggerimenti

Per gli altri che hanno questo problema e hanno gonfiato un layout in ArrayAdapter di getView, impostare il parametro parent a null, come in view = inflater.inflate(R.layout.mylayout, null);

regola empirica

Si dovrebbe sempre tenta di passare in un genitore durante il gonfiaggio di una vista, altrimenti il ??quadro non sarà in grado di identificare ciò che l'impaginazione params da utilizzare per quella vista gonfiato.

modo corretto di gestire l'eccezione è passando false come terzo parametro , questo flag indica se una vista deve essere aggiunto direttamente al il contenitore superato o meno.

Nel caso di un adattatore, l'adattatore stesso aggiungerà la vista dopo aver restituito la vista da voi GetView metodo:

= visualizzare inflater.inflate (R.layout.mylayout, genitore, false );

BaseAdapter di esempio, viene da just-per- noi 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 del campione:

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

Maggiori informazioni sulla vista l'inflazione può essere trovato in questo articolo .

Elimina TextView Da ListView nel file XML

il mio problema era questo: sovrascrivo GetView in arrayAdapter. poi quando ho gonfiato vista, ho dimenticato di serie attribuiscono alla radice false e che ha causato questa eccezione.

questo è come deve essere fatto:

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

dopo che problema risolto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top