Ошибка Logcat: «addView (View, LayoutParams) не поддерживается в AdapterView» в ListView - PullRequest
38 голосов
/ 02 января 2011

Я делаю приложение для Android, и мне нужно, чтобы оно показывало список всех файлов и каталогов на SD-карте и могло перемещаться по разным каталогам.Я нашел хороший учебник в anddev .Я изменил несколько вещей, чтобы приложение перемещалось на SD-карту, а не в корневые каталоги Android, но в остальном это в основном то же самое.

Это мой XML-файл для действия:

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

И это код для Activity:

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

Я не получаю никаких ошибок в Eclipse, но я получаю Force Close при запуске приложения на моем телефоне и при просмотре Logcat, я вижуследующее:

01-01 23: 30: 29.858: ОШИБКА / AndroidRuntime (14911): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main 01-01 23: 30: 29.858: ОШИБКА / AndroidRuntime(14911): java.lang.UnsupportedOperationException: addView (View, LayoutParams) не поддерживается в AdapterView

Понятия не имею, что делать, я посмотрел в Google иничего не нашел, и я сделал то же самое в stackoverflow.Это мое первое приложение на Java и для Android, так что я настоящий n00b, и если бы ответ был, я бы не понял его, поэтому я был бы очень признателен, если бы вы могли объяснить, что я должен сделать, чтобы исправить эту ошибку и почему.

Спасибо за все заранее.

Ответы [ 4 ]

71 голосов
/ 20 июня 2013

Для тех, у кого возникла эта проблема и которые раздули макет в ArrayAdapter getView, установите параметр parent на null, как в view = inflater.inflate(R.layout.mylayout, null);

65 голосов
/ 25 августа 2014

эмпирическое правило

Вы всегда должны пытаться передать родительский элемент во время надувания View, иначе каркас не сможет определить, какие параметры макета использовать для этого завышенного представления.

правильный способ обработки исключения - передача false в качестве третьего параметра , этот флаг указывает, следует ли добавлять представление непосредственно в переданный контейнер или нет.

В случае с адаптером сам адаптер добавит представление после того, как вы вернули представление из метода getview:

view = inflater.inflate (R.layout.mylayout, родитель, false );

BaseAdapter образец, поставляется с только для нас 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 образец:

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

Более подробную информацию о просмотре инфляции можно найти в этой статье .

14 голосов
/ 02 января 2011

При создании ArrayAdapter , как у вас, ArrayAdapter требуется ресурс макета , содержащий только TextView. Попробуйте изменить создание ArrayAdapter с помощью:

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

ипосмотрите, работает ли он.

0 голосов
/ 01 мая 2018

Удалить TextView из ListView в вашем файле XML

...