Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改CursorAdapter的光标会导致staleDataException_Android_Sqlite_Android Cursoradapter - Fatal编程技术网

Android 更改CursorAdapter的光标会导致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

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

我有两个列表视图。一个为“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:试图访问关闭的游标窗口。最可能的原因:在调用此方法之前,游标已停用

下面是代码说明:

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);
    }
}