更改CursorAdapter的游标会产生staleDataException

时间:2013-11-08 12:29:16

标签: android sqlite android-cursoradapter

好的,所以经过大量的网站和博客后,我终于决定问这个'不是那么常见问题'。

我有2个listViews。一个是“LV类”,另一个是“LV项”。功能非常简单 - 当用户点击“类别LV”中的类别单元格时,与该类别匹配的所有项目都应过滤并显示在“项目LV”中。我这样做是通过为数据库中的每个项目分配'category integer'。因此,当点击一个类别时,将获取其整数id,并在项目数据库中加载与它匹配的所有ID。

问题: 我使用adapter.changeCursor(newCursor)方法来更改适配器中的基础数据。根据文档,此方法替换并关闭先前加载的游标。我收到此错误

  

11-08 11:54:15.939:E / AndroidRuntime(2056):android.database.StaleDataException:尝试访问已关闭的CursorWindow.Most可能原因:在调用此方法之前,游标已停用。

下面是代码解释:

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提供动力。但是,我不认为这可能是一个问题。

1 个答案:

答案 0 :(得分:0)

在最后一句话中:

  

这里要注意的一件事是我使用相同的Adapter类来为listViews提供动力。但是,我不认为这可能是一个问题。

只是为了确认:您是否在两个列表视图中使用1个Adapter实例或2个相同Adapter类的实例?你不能为2个列表视图共享相同的实例,否则你会得到像你一样的异常。