从SQLite数据库填充自定义列表视图

时间:2011-02-07 09:25:03

标签: android sqlite listview

我在onCreate()中有这段代码:

try{
    Log.i("onCreate","Trying to open database...");
    orgi = this.openOrCreateDatabase("orgi", MODE_PRIVATE, null);

    Log.i("onCreate","database opened.");
    cursor = orgi.rawQuery("SELECT name from profile;",null);
    Log.i("onCreate","successfully done with query..");
    adapter = new SimpleCursorAdapter(this,R.layout.profilelistrow,cursor, 
            new String[]{"name"},new int[] {R.id.profileListRowTV1});
    Log.i("onCreate","Adapter done");

    ll.setAdapter(adapter);

}catch (SQLException e){
    displayError(e.toString());
}

我应该使用SQLite数据库中的数据填充customlistview。但是它给了我一条紧靠这条线的力量:

adapter = new SimpleCursorAdapter(this,R.layout.profilelistrow,cursor, 
            new String[]{"name"},new int[] {R.id.profileListRowTV1});

有人可以告诉我出了什么问题吗?我对简单的光标适配器非常无知(由于我在Android中的noobness)... R.layout.profilelistrow是我整个屏幕的布局,而profileListRowTV1是将插入“name”的textview。请教我这个...我做错了什么?

2 个答案:

答案 0 :(得分:1)

我不知道是什么问题,因为你给了我们代码而没有错误,在eclipse中 - >窗口 - >开放视角 - > DDMS。当你的力量关闭时,看看日志猫。怎么样。这是我朋友的一个例子。

主要列表XML ...您可以在布局中的任何位置添加列表视图...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:background="#FFFFD0"
android:layout_height="fill_parent"
android:orientation="vertical">



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

 <TextView android:id="@android:id/empty"
     android:layout_width="wrap_content"
     android:textColor="#4B89E0" 
     android:layout_height="wrap_content"
     android:text="The list is empty! Do I need this? No idea!"
     />


</LinearLayout>

接下来的行: 现在这些变得非常复杂。我有一个程序,列表有5个图像和3个文本视图,android似乎很好地处理它。但这里有一个基本的,3个文本视图......也可以同时使用。

<?xml version="1.0" encoding="utf-8"?>
<!-- row.xml -->
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:paddingTop="4dip"
 android:textAppearance="?android:attr/textAppearanceLarge"
 android:paddingBottom="6dip"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical">

 <LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">

 <TextView android:id="@+id/text1"
    android:textColor="#4B89E0" 
     android:layout_width="130dip"
     android:layout_height="40dip"
     android:textSize = "15dip"
     />

 <TextView android:id="@+id/text2"
    android:textColor="#4B89E0" 
     android:layout_width="70dip"
     android:gravity = "center"
     android:textStyle = "bold"
     android:layout_height="wrap_content" />

 <TextView android:id="@+id/text3"
    android:textColor="#4B89E0" 
    android:gravity = "center"
     android:layout_width="80dip"
     android:layout_height="wrap_content"  />

</LinearLayout>          

</LinearLayout>

最后将一些代码放在一起......在这个例子中调用fillData();填写清单。我通常喜欢这样做,以便当我更改数据库时,我正在检索哪些信息(即我想看到:所有形状或圆形或方形),列表很容易更新。我假设您的数据库已经打开。你在OnCreate()中打开它。  而不是在OnCreate方法中使用所有这些代码创建自己的方法“fillData”,而您在OnCreate中必须拥有的只是 fillData(); 。这样可以更轻松地查看,编辑和排除故障。

private void fillData() {

        Cursor fetchInfo = mDbHelper.fetchAllRecords();
        startManagingCursor(fetchInfo);


        // Create an array to specify the fields we want to display in the list (TITLE,DATE,NUMBER)
        String[] from = new String[]{DbAdapter.KEY_TITLE, 
                 DbAdapter.KEY_DATE, DbAdapter.KEY_AUTHOR   };

        // an array of the views that we want to bind those fields to (in this case text1,text2,text3)
        int[] to = new int[]{R.id.text1, R.id.text2, R.id.text3};

        // Now create a simple cursor adapter and set it to display
        SimpleCursorAdapter notes = 
            new SimpleCursorAdapter(this, R.layout.list_row, fetchInfo, from, to);
        setListAdapter(notes);
    }

WakaWaka

好运

答案 1 :(得分:0)

你的问题应该在这一行。

cursor = orgi.rawQuery("SELECT name from profile;",null);

SimpleCursorAdapter以及许多Android功能依赖于具有名为“_id”的标识符键。因此,请确保您的查询返回带有该标识符的行。在您的情况下,您应该将该行更改为此

cursor = orgi.rawQuery("SELECT yourTableId AS '_id', name FROM profile;",null);

这应该可以解决你的问题。