如果SimpleCursorAdapter关闭,ListView为空()

时间:2011-10-26 10:44:15

标签: android android-listview simplecursoradapter

当我在 cursor 对象上调用 close()方法时,我的问题是理解为什么我的ListActivity及其对应的 listView 为空? / p>

让我解释一下......

我从数据库中检索了一些值,并在我的游标对象中获取结果。之后,我创建了 SimpleCursorAdapter 并使用我的 listView 中的字段从db绑定列。

像魅力一样,但是......

如果我在 onCreate()方法的末尾调用 cursor.close(),我的listView会显示为空?

如果我将值从光标记录到LogCat,它们就在那里,直到调用 cursor.close()并且这很有意义,但为什么在 cursor.close时listAdapter被清空( )被称为??? 我希望 ListAdapter listAdapter = new SimpleCursorAdapter(...)将“绑定”的值保存到 listView ,直到我们的活动被销毁...

为什么会这样?什么时候需要关闭光标?

public class ListTrainingsView extends ListActivity{
private SQLiteDatabase db;
private ListAdapter  listAdapter;
private Cursor cursor;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_trainings);

    DatabaseHelper helper = new DatabaseHelper(this);

    this.db = helper.getWritableDatabase();

    this.cursor = db.query("trainings", fields, null, null, null, null, null);

    startManagingCursor(cursor);

    this.listAdapter = new SimpleCursorAdapter(this,
            R.layout.list_trainings_item, 
            cursor, 
            new String[] {"name"},
            new int[] { R.id.name_entry}
    );

    this.setListAdapter(this.listAdapter);

//If I call 
//cursor.close();
//shown list is empty

另一个问题是更多基本的Java语言类型问题...我来自PHP OO背景,如果你定义成员变量,你必须使用语法 $ this-> cursor在对象方法中使用它。我注意到在Android / Java中我不必使用 this.cursor.getCount()来从中获取引用/值。这就足以说 cursor.getCount()为什么允许这样做?

2 个答案:

答案 0 :(得分:2)

你不应该关闭你的游标unil你的Activity被销毁(即在onDestroy()中),因为CursorAdapter的实现期望它被打开以便能够重新查询和过滤它。

由于您无论如何都在调用startManagingCursor,因此您的Activity将自动停用,重新查询并关闭相应的Activity生命周期事件,因此无需自行关闭它。

答案 1 :(得分:1)

  

为什么会这样?

Adapter需要提供Cursor的数据并相应地准备ListView,当您致电cursor.close()时,Cursor将被释放并失效。 (表示没有数据。)

  

什么时候需要关闭光标?

当您即将离开Cursor并从Activity返回时,有必要关闭Activity,否则Cursor已被泄露Activity }。

  

这就足以说了cursor.getCount()为什么允许这样做?

Java的结构基于类。每个动作都在特定的课程中完成。即使回应“单行”也需要一个班级。当您在课堂上时,您可以使用this 访问具有直接变量的班级成员

  • 有关详情,请参阅here