输出ListView异常:来自xml类型布局资源ID#0x102000a的文件

时间:2012-04-14 12:41:20

标签: android listview listactivity

我正在尝试从SQLite数据库输出一个列表,并且遇到了这个异常:

android.content.res.Resources $ NotFoundException:来自xml类型布局资源ID的文件#0x102000a

在检查了类似的问题后,我确保我的ListView被定义为@ id / android:list但仍然得到相同的异常。 ListActivity类中的onCreate方法完成时会发生此问题。 getAllDiaryEntries()方法确实从db获取数据,但是一旦它返回到ListActivity类并且onCreate完成,我得到了异常。这是代码的相关部分。

这是ListActivity类:

public class DiarySchedule extends ListActivity
{
private DiaryDataSource datasource;
private static final String TAG = "DiaryDbAdapter";

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.diary_schedule);

    datasource = new DiaryDataSource(this);
    datasource.open();

    List<DiaryEntry> values = datasource.getAllDiaryEntries();

    ArrayAdapter<DiaryEntry> adapter = new ArrayAdapter<DiaryEntry>(this,
            android.R.id.list, values);
    setListAdapter(adapter);
}

接下来我们有getAllDiaryEntries()方法:

public List<DiaryEntry> getAllDiaryEntries() 
{
    List<DiaryEntry> diaryEntries = new ArrayList<DiaryEntry>();

    Cursor cursor = database.query(DiaryDbAdapter.DIARY_TABLE,
            allColumns, null, null, null, null, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) 
    {
        DiaryEntry diaryEntry = cursorToDiaryEntry(cursor);
        diaryEntries.add(diaryEntry);
        cursor.moveToNext();
    }
    // Make sure to close the cursor
    cursor.close();
    return diaryEntries;
}

布局(未设置样式或其他任何内容):

<ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

我还是Android的新手,所以可能错过了一些简单的东西,但提前感谢任何帮助。

已编辑 - 这是cursortoDiaryEntry方法

私有DiaryEntry cursorToDiaryEntry(光标游标)     {         DiaryEntry diaryEntry = new DiaryEntry();         diaryEntry.setId(cursor.getLong(0));         diaryEntry.setTitle(cursor.getString(1));         diaryEntry.setDate(cursor.getString(2));         diaryEntry.setDescription(cursor.getString(3));         return diaryEntry;     }

2 个答案:

答案 0 :(得分:2)

ArrayAdapter的构造函数(您正在使用的构造函数)定义如下:

public ArrayAdapter (Context context, int textViewResourceId, List<T> objects)

在这里textViewResourceId是“包含在实例化视图时使用的TextView的布局文件的资源ID”。请参阅here

您应该使用R.layout.layout_file传递包含<TextView/>元素的布局文件。

答案 1 :(得分:1)

dennisg有正确的答案来解决您的问题。

我可以建议您将光标变为数组,从而进行额外的工作吗?您可以直接使用光标创建列表适配器来保存一些周期。

Cursor cursor = database.query(DiaryDbAdapter.DIARY_TABLE,
        allColumns, null, null, null, null, null);
getActivity().startManagingCursor(cursor);

String[] from = new String[] { DiaryDbAdapter.DIARY_ENTRY };
int[] to = new int[] {  R.id.ListItem1 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(),
    R.layout.listlayoutdouble, cursor, from, to);
setListAdapter(adapter);

您的from string []包含您希望包含在显示中的列的列表,to int []包含您希望将数据放入的资源ID(与from数组匹配的顺序)。然后适配器callout指定要使用的行布局,将数据映射到视图的光标和两个数组。