0

好的,所以在浏览了大量网站和博客之后,我终于决定问这个“不太常见的问题”。

我有 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 供电。但是我不认为这可能是一个问题。

4

1 回答 1

0

在最后的声明中:

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

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

于 2013-11-13T09:34:51.190 回答