Android 更改CursorAdapter的光标会导致staleDataException
好吧,在浏览了大量的网站和博客之后,我终于决定问这个“不太常见的问题” 我有两个列表视图。一个为“LV类”,另一个为“项目LV”。功能非常简单-当用户单击“category LV”中的类别单元格时,与该类别匹配的所有项目都应过滤并显示在“item LV”中。我通过为数据库中的每个项目分配“category integer”来实现这一点。因此,当点击一个类别时,将获取其整数id,并将项目数据库中与其匹配的所有id加载到光标中 问题: 我使用adapter.changeCursor(newCursor)方法来更改适配器中的基础数据。根据文档,此方法替换并关闭先前加载的光标。我得到了这个错误 11-08 11:54:15.939:E/AndroidRuntime(2056):android.database.StaleDataException:试图访问关闭的游标窗口。最可能的原因:在调用此方法之前,游标已停用 下面是代码说明:Android 更改CursorAdapter的光标会导致staleDataException,android,sqlite,android-cursoradapter,Android,Sqlite,Android Cursoradapter,好吧,在浏览了大量的网站和博客之后,我终于决定问这个“不太常见的问题” 我有两个列表视图。一个为“LV类”,另一个为“项目LV”。功能非常简单-当用户单击“category LV”中的类别单元格时,与该类别匹配的所有项目都应过滤并显示在“item LV”中。我通过为数据库中的每个项目分配“category integer”来实现这一点。因此,当点击一个类别时,将获取其整数id,并将项目数据库中与其匹配的所有id加载到光标中 问题: 我使用adapter.changeCursor(newCurso
itemAdapter=new CategoryCursorAdapter(this, itemCursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER, "item_name",1,date,db);
categoryLV.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
String s=((TextView)arg1.findViewById(R.id.category_name)).getText().toString();
if(s.equalsIgnoreCase("all")){
itemAdapter.changeCursor(null);
itemAdapter.notifyDataSetChanged();
}
else{
itemAdapter.changeCursor(db.getItemCursor(s));
itemAdapter.notifyDataSetChanged();
}
}
});
这里需要注意的一点是,我使用相同的适配器类为两个ListView提供电源。不过,我认为这不是一个问题。在最后一句话中:
这里需要注意的一点是,我使用相同的适配器类为两个ListView提供电源。然而,我不认为这会是一个问题
确认一下:您是在两个列表视图中使用同一适配器类的1个适配器实例还是2个实例?您不能为两个列表视图共享同一个实例,否则您将得到与您一样的异常。这里需要注意的一点是,我使用相同的适配器类为两个列表视图提供电源。然而,我不认为这会是一个问题这很可能就是问题所在。不要共享适配器
changeCursor()
已经调用了notifyDataSetChanged()
,所以不要再调用它。我使用的是同一个适配器类,但我定义了该类的不同对象,以便在不同的ListView中使用它们。其次,如果不使用notifyDataSetChanged(),我就没有运气了,因为您正在以相同的方法处理行视图/数据,因此在bindView()中的两个if
条件之间使用…else if(mcolumn==ITEM_LV){…
)子句是没有意义的
method?它如何改变代码的执行方式。虽然为了消除任何疑问,我尝试使用else if,但问题仍然存在,我正在创建同一类的两个不同实例,并在两个不同的位置使用它们
public void bindView(View view, Context context, Cursor cursor) {
// TODO Auto-generated method stub
if(mcolumn==CATEGORY_LV){
TextView tv=(TextView)view.findViewById(R.id.category_name);
tv.setText(mCursor.getString(mCursor.getColumnIndex(mColumnName)));
tv.setTextSize(20);
}
if(mcolumn==ITEM_LV){
TextView item=(TextView)view.findViewById(R.id.item_name);
TextView stock=(TextView)view.findViewById(R.id.stock_status);
// I get the staleDataException at this place
String s=mCursor.getString(mCursor.getColumnIndex(mColumnName));
Button drag=(Button)view.findViewById(R.id.drag_button);
LinearLayout lv=(LinearLayout)view.findViewById(R.id.layout);
drag.setFocusable(false);
item.setText(s);
item.setTextSize(20);
stock.setText("Stock:"+mdb.getStockStatus(mdb.getItemCode(s), mDate));
stock.setTextSize(15);
}
}