Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 试图访问关闭的游标窗口。最可能的原因:在调用此方法之前,游标已停用_Android_Cursor - Fatal编程技术网

Android 试图访问关闭的游标窗口。最可能的原因:在调用此方法之前,游标已停用

Android 试图访问关闭的游标窗口。最可能的原因:在调用此方法之前,游标已停用,android,cursor,Android,Cursor,如何解决给定的错误?它发生在我试图从actionbar刷新光标时,有时在长时间单击列表项后再次尝试删除光标时 MainActivity.java public class MainActivity extends AppCompatActivity { private final String QUERY_SELECTALL = "SELECT * FROM " + RjecnikDB.TABLE; private RjecnikCursorAdapter adapter; private Rj

如何解决给定的错误?它发生在我试图从actionbar刷新光标时,有时在长时间单击列表项后再次尝试删除光标时

MainActivity.java

public class MainActivity extends AppCompatActivity {
private final String QUERY_SELECTALL = "SELECT * FROM " + RjecnikDB.TABLE;
private RjecnikCursorAdapter adapter;
private RjecnikDB dbRjecnik;
private SQLiteDatabase db;
private Cursor cursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onRestart() {
    super.onRestart();
    refresh();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.search_bar) {
        return true;
    } else if (id == R.id.refresh) {
        refresh();
    }

    return super.onOptionsItemSelected(item);
}
public void refresh() {
    dbRjecnik = RjecnikDB.getInstance(this);
    db = dbRjecnik.getReadableDatabase();
    cursor = db.rawQuery(QUERY_SELECTALL, null);
    adapter = RjecnikCursorAdapter.getInstance(this, cursor);
    adapter.changeCursor(cursor);
}
WordsListFragment.java

public class WordsListFragment extends Fragment {
private final String QUERY_SELECTALL = "SELECT * FROM " + RjecnikDB.TABLE;

private RjecnikCursorAdapter adapter;
private RjecnikDB dbRjecnik;
private SQLiteDatabase db;
private Cursor cursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.words_list_fragment_layout, container, false);

    ListView listView = (ListView) view.findViewById(R.id.listView);
    fabAddWord = (FloatingActionButton) view.findViewById(R.id.fabAddWord);

    dbRjecnik = RjecnikDB.getInstance(getActivity());
    db = dbRjecnik.getWritableDatabase();
    cursor = db.rawQuery(QUERY_SELECTALL, null);
    adapter = RjecnikCursorAdapter.getInstance(getActivity(), cursor);
    listView.setAdapter(adapter);

    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            int _id = cursor.getInt(cursor.getColumnIndex(RjecnikDB.COLUMN_ID));

            DiscardDialogFragment newFragment = new DiscardDialogFragment(_id);
            newFragment.show(getFragmentManager(), "discard");
            return true;
        }
    });
    return view;
}

public void changeCursor() {
    dbRjecnik = RjecnikDB.getInstance(getActivity());
    db = dbRjecnik.getReadableDatabase();
    cursor = db.rawQuery(QUERY_SELECTALL, null);
    adapter.changeCursor(cursor);
}

public void deleteOnLongClick(int id) {
    db = dbRjecnik.getWritableDatabase();
    db.delete(RjecnikDB.TABLE, RjecnikDB.COLUMN_ID + " = ?", new String[] { Integer.toString(id) } );
}

public class DiscardDialogFragment extends DialogFragment {
    int colID;

    DiscardDialogFragment() {}
    DiscardDialogFragment(int colID) { this.colID = colID; }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("Izbriši riječ?")
                .setPositiveButton("IZBRIŠI",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                deleteOnLongClick(colID);
                                changeCursor();
                                Toast.makeText(getActivity(),
                                        "Riječ je izbrisana iz baze", Toast.LENGTH_SHORT).show();
                            }
                        })
                .setNegativeButton("OTKAŽI", null);
        return builder.create();
    }
}
公共类WordsListFragment扩展了片段{
私有最终字符串查询\u SELECTALL=“SELECT*FROM”+RjecnikDB.TABLE;
专用Rjecnikursoradapter适配器;
私人RjecnikDB dbRjecnik;
专用数据库数据库;
私有游标;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(真);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.words\u list\u fragment\u layout,container,false);
ListView=(ListView)view.findViewById(R.id.ListView);
fabAddWord=(FloatingActionButton)view.findViewById(R.id.fabAddWord);
dbRjecnik=RjecnikDB.getInstance(getActivity());
db=dbRjecnik.getWritableDatabase();
cursor=db.rawQuery(QUERY\u SELECTALL,null);
adapter=RjecnikCursorAdapter.getInstance(getActivity(),cursor);
setAdapter(适配器);
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
int_id=cursor.getInt(cursor.getColumnIndex(RjecnikDB.COLUMN_id));
DiscardDialogFragment newFragment=新DiscardDialogFragment(_id);
show(getFragmentManager(),“discard”);
返回true;
}
});
返回视图;
}
公共void changeCursor(){
dbRjecnik=RjecnikDB.getInstance(getActivity());
db=dbRjecnik.getReadableDatabase();
cursor=db.rawQuery(QUERY\u SELECTALL,null);
adapter.changeCursor(游标);
}
public void deleteOnLongClick(int-id){
db=dbRjecnik.getWritableDatabase();
delete(RjecnikDB.TABLE,RjecnikDB.COLUMN_ID+“=?”,新字符串[]{Integer.toString(ID)});
}
公共类DiscardDialogFragment扩展了DialogFragment{
int-colID;
丢弃DialogFragment(){}
DiscardDialogFragment(int-colID){this.colID=colID;}
@凌驾
创建对话框上的公共对话框(Bundle savedInstanceState){
AlertDialog.Builder=新建AlertDialog.Builder(getActivity());
builder.setMessage(“Izbriši riječ?”)
.setPositiveButton(“IZBRIŠI”,
新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
deleteOnLongClick(colID);
changeCursor();
Toast.makeText(getActivity(),
“Riječje izbrisana iz baze”,吐司。长度(短)。show();
}
})
.setNegativeButton(“OTKAŽI”,空);
返回builder.create();
}
}

有没有人想在一堂课上掌握这个更改光标或刷新,我尝试了很多方法,但都是错误。

当我返回到我的应用程序(从我的应用程序打开的另一个应用程序)时,我遇到了同样的错误


我的解决方案是将我的
spinnerAdapter.changeCursor(游标)
code替换为
spinnerAdapter.swapCursor(游标)

我怀疑我们都有类似的问题。我在每个列表项的复选框上都有一个侦听器。当光标关闭时,侦听器正在启动。发布RjecnikursorAdapter的代码,或者您可以自己测试侦听器。检查上面代码中设置的侦听器,或者RjecnikursorAdapter.bindView或RjecnikursorAdapt中的任何设置呃,getView

这一评论是不正确的:

我没有任何游标.close()调用


adapter.changeCursor(cursor)为您关闭旧的光标。

在我的案例中,我也遇到了同样的问题,清理并重建项目对我有效。 此外,我甚至删除了手机中的应用程序数据,并更改了
adapter.close()到adapter.swapCursor(cursor);

这是因为您可能会调用cursor.close(),然后使用cursor会出现此类错误。请发布数据库类代码。您可以在此处参考以获得更好的数据库管理,我没有任何cursor.close()调用。