我有一个ListView
来调整游标中的数据。光标的记录位置通过View.setTag()
存储,因此可以检索它以响应用户事件。
public class OrderActivity extends Activity {
private ListView list;
private CursorAdapter adapter;
private SQLiteDatabase database;
public void onResume() {
database = new Database(this).getWriteableDatabase();
// query the db and store the position of the cursor
// as the tag while binding the view in the overridden
// CursorAdapter.bindView()
adapter = new SimpleCursorAdapter( /* code here */ );
list.setAdapter(adapter);
}
public void onPause() {
adapter.changeCursor(null);
database.close();
}
private void onClickRowDumpOrder(View row) {
int newPosition = (Integer) row.getTag();
Cursor cursor = adapter.getCursor();
int originalPosition = cursor.getPosition(); // Throws NPE
cursor.moveToPosition(newPosition);
Log.v("tag", "Description: " + cursor.getString(0));
// restore the cursor
cursor.moveToPosition(originalPosition);
}
}
我将数据库和适配器存储在Activity的实例字段中,以在活动生命周期中分配/释放资源:我创建了一个新数据库onResume
并关闭它onPause
。不幸的是,我收到了很多来自我的用户的报告,NPE被引入上面伪代码中列出的行中,但是我无法重现它。
似乎cursor
是null
,但我想知道如果只能在onClickRowDumpOrder
之后调用方法onResume
,这是可能的,因为它是对android:onClick
的回调。 click事件(我通过cursor
我做错了吗? API错误导致android:onClick
为空?是否有一些文档描述了游标和适配器如何适应活动生命周期?
更新
我在我的XML文件中删除了SimpleCursorAdapter.bindView
并在onPause
内手动设置了侦听器。为了避免泄漏,我在自定义AbsListView.RecycleListener
和我的活动android:onClick
中删除了侦听器(我使用reclaimViews(List<View>)
检索所有视图)。这似乎解决了这个问题,这是我的解释。
AbsListView.RecycleBin
属性时这种解释是现实的,但我没有在Android类中找到相关代码({{1}}中有一个缓存,但ListView本身不会被重用)。此外,我从来没有能够重现这个错误,我只觉得我的修复工作,因为在过去的两天里我没有收到任何报告(通常我每天都会得到几十个)
您是否了解Android堆栈中可以验证我的假设的任何代码?
答案 0 :(得分:0)
if (cursor.moveToFirst()) {
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
}
}
答案 1 :(得分:0)
我认为你是在Activity生命周期的错误点创建游标。 ListView sample onCreate()
将onResume()
中的内容放入{{1}}。我不知道它一定是有害的,但你可能正在重新创造一些不需要的东西。