android:list可以在同一个应用程序中使用两次吗? (单独活动)

时间:2012-02-06 20:59:37

标签: android sqlite listview cursor

我有一个应用程序,它在两个不同的地方列出来自SQLite的项目,以便填充列表视图。我在两个地方使用相同的代码(当然,调整表和字段名称),但只有第一个listview填充数据。如果我在两个活动之间切换表/字段名称,我第一个正确填充了第二个活动中没有填充的数据。我想知道@ + id / android:list是否在第一个活动中得到保留或其他内容,禁止它在第二个活动中填充。

我已经在第二个活动中记录了游标数据,以确保我实际上是在游标中获取数据而我是。我没有在Logcat中为没有填充的ListView获得任何类型的任何异常或相关消息。当我交换表/字段名称时,最初填充到第一个列表视图的数据同样不会填充到第二个列表视图。我唯一能想到的是@ + id / android:list是volatile,每个应用程序只能使用一次。这是正确的还是我缺少一个细节?

第一项活动:

private static final String fields[] = { "firstfield1", "firstfield2",  "_id" };
...
final CursorAdapter dataSource;
    DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getWritableDatabase();
    Cursor cur = database.rawQuery("SELECT COUNT(*) firsttable", null);
    if (cur != null) {
        cur.moveToFirst();                       // Always one row returned.
        if (cur.getInt (0) == 0) {               // Zero count means empty table.

        } else {
            Cursor data = database.query("firsttable", fields, null, null, null, null, null);
            dataSource = new SimpleCursorAdapter(this, R.layout.rowcolumns, data, fields, new int[] { R.id.firstfield1, R.id.firstfield2});
            data.moveToFirst();

            while (data.isAfterLast() == false){
                Log.i("MyActivity", "data: "+data.getString(0));
                data.moveToNext();
            }

            final ListView view = getListView();

            setListAdapter(dataSource);
}

ROWCOLUMNS.XML

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:paddingTop="4dip"
 android:paddingBottom="6dip"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">

 <TextView android:id="@+id/firstfield1"
     android:layout_width="100dp"
     android:layout_height="wrap_content" 
     android:layout_weight="1"
     />

 <TextView android:id="@+id/firstfield2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"  
     android:layout_weight="1" 
     android:layout_marginLeft="30dp"/>
</LinearLayout>

第二次活动

private static final String fields[] = { "secondfield1", "secondfield2",  "_id" };
...
    final CursorAdapter dataSource;
    DatabaseHelper helper = new DatabaseHelper(this);
    database = helper.getWritableDatabase();
    Cursor cur = database.rawQuery("SELECT COUNT(*) secondtable", null);
    if (cur != null) {
        cur.moveToFirst();                       // Always one row returned.
        if (cur.getInt (0) == 0) {               // Zero count means empty table.
            Log.i("CastrActivity", "Empty cursor");
        } else {
            Cursor data = database.query("secondtable", listFields, null, null, null, null, null);
            dataSource = new SimpleCursorAdapter(this, R.layout.secondcolumns, data, listFields, new int[] { R.id.secondfield1, R.id.secondfield2});
            data.moveToFirst();

            while (data.isAfterLast() == false){
                Log.i("MyActivity", "data: "+data.getString(0));
                data.moveToNext();
            }
            final ListView view = getListView();

            setListAdapter(dataSource);
}

SECONDCOLUMNS.XML          

 <TextView android:id="@+id/secondfield1"
     android:layout_width="100dp"
     android:layout_height="wrap_content" 
     android:layout_weight="1"
     />

 <TextView android:id="@+id/secondfield2"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"  
     android:layout_weight="1" 
     android:layout_marginLeft="30dp"/>
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

不,如果您尝试按照您的描述使用,则不能。您获得的列表仅限于该活动方法。如果您不想在第二个活动中进行另一个数据库调用,您可以打包该列表并在另一个包中使用它。

答案 1 :(得分:-1)

我试图关闭SimpleCursorAdapter使用的游标。我的印象是游标应该在某一点之后总是关闭,但我想情况并非如此。