我有一个应用程序,它在两个不同的地方列出来自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>
答案 0 :(得分:0)
不,如果您尝试按照您的描述使用,则不能。您获得的列表仅限于该活动方法。如果您不想在第二个活动中进行另一个数据库调用,您可以打包该列表并在另一个包中使用它。
答案 1 :(得分:-1)
我试图关闭SimpleCursorAdapter使用的游标。我的印象是游标应该在某一点之后总是关闭,但我想情况并非如此。