Logcat错误:ListView中的“AdapterView中不支持addView(View,LayoutParams)”

我正在为Android做一个应用程序,我需要的是它显示了SD卡中的所有文件和目录的列表,并且必须能够移动通过不同的目录。 我在anddevfind了一个很好的教程 。 我修改了一些东西,以便应用程序在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> 

这是活动的代码:

  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):致命exception:主 01-01 23:30:29.858:错误/ AndroidRuntime(14911):java.lang.UnsupportedOperationException:addView(View,LayoutParams)在AdapterView中受支持

我不知道该怎么做,我在谷歌查找,我没有find任何东西,我做了相同的计算器。 这是我在Java和Android的第一个应用程序,所以我是一个真正的n00b,如果答案在那里,我不明白,所以我会很感激,如果你能解释我应该做什么来解决这个错误,为什么。

感谢一切提前。

Solutions Collecting From Web of "Logcat错误:ListView中的“AdapterView中不支持addView(View,LayoutParams)”"

在创build像你的ArrayAdapter时,ArrayAdapter需要一个只包含TextView的布局资源 尝试更改您的ArrayAdapter创build:

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

看看它是否有效。

对于其他有此问题的人,在ArrayAdaptergetViewArrayAdapter了布局,将parent参数设置为null ,如view = inflater.inflate(R.layout.mylayout, null);

经验法则

你应该总是尝试传递一个父视图的同时膨胀一个视图,否则框架将无法确定哪些布局参数用于该充气视图。

处理exception的正确方法是通过传递false作为第三个参数 ,该标志指示是否应将视图直接添加到传递的容器中。

在适配器的情况下,适配器本身将在您从getview方法返回视图之后添加视图:

view = inflater.inflate(R.layout.mylayout,parent, 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); } 

有关查看通货膨胀的更多信息可以在这篇文章中find。