好的,所以在浏览了大量网站和博客之后,我终于决定问这个“不太常见的问题”。
我有 2 个列表视图。一个作为“类别 LV”,另一个作为“项目 LV”。该功能非常简单——当用户单击“类别 LV”中的类别单元格时,所有与该类别匹配的项目都应过滤并出现在“项目 LV”中。我通过将“类别整数”分配给数据库中的每个项目来做到这一点。因此,当一个类别被点击时,它的整数 id 被获取,并且项目数据库中与它匹配的所有 id 都被加载到游标中。
问题:我使用 adapter.changeCursor(newCursor) 方法来更改适配器中的基础数据。根据文档,此方法替换并关闭先前加载的游标。我收到此错误
11-08 11:54:15.939: E/AndroidRuntime(2056): android.database.StaleDataException: 试图访问已关闭的 CursorWindow。最可能的原因:在调用此方法之前,光标已停用。
下面是解释的代码:
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();
}
}
});
我在 CursorAdapter 类中得到错误:
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);
}
}
这里要注意的一件事是,我使用相同的 Adapter 类来为两个 listViews 供电。但是我不认为这可能是一个问题。