java.lang.IllegalStateException:无法将光标移动到位置n

时间:2016-04-19 09:21:22

标签: java android listview android-cursoradapter android-cursor

我想要导入联系人并将其显示在set serveroutput on; DECLARE lv_sql VARCHAR2(1000); lv_cnt PLS_INTEGER; BEGIN lv_sql:='select count(*) from tab1'; dbms_output.put_line(lv_sql); --EXECUTE IMMEDIATE lv_sql INTO lv_cnt; END 中。 这是我的光标加载器

ListView

我的适配器是

        ContentResolver cr = getActivity().getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");


        mAdapter = new ContactsAdapter(getActivity(), cur, true, null);

        setListAdapter(mAdapter);

这是我的bindview

for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
        // do what you need with the cursor here
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        Log.e("name", name + "\n" + cursor.getCount());
        names.add(name);

    }
getIndexList();

@Override public void bindView(View view, Context context, Cursor cursor) { // Gets handles to individual view resources final ViewHolder holder = (ViewHolder) view.getTag(); String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); for (phoneCursor.moveToFirst(); !phoneCursor.isAfterLast(); phoneCursor.moveToNext()) { // do what you need with the cursor here String phoneNum = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.e("phoneNum", phoneNum); mCheckBox.setTag(phoneNum); if (selectedNums.contains(phoneNum)) { mCheckBox.setChecked(true); } else { mCheckBox.setChecked(false); } } 到达结尾时,我的代码崩溃了。如果有2个联系人我收到错误 java.lang.IllegalStateException:无法将光标移动到位置2 同样,如果我有n个联系人就是这种情况。 我见过this question但在那里找不到任何答案。请帮忙

这是日志

ListView

here is screenshot of logcat

我找不到显示的错误行。这让我很困惑

2 个答案:

答案 0 :(得分:2)

感谢您的帮助。此问题与getCount()有关。我之前做过这个,之后我没有注意到。

@Override
    public int getCount() {
        return names.size();
    }

我删除了它,它工作正常。谢谢你的帮助

答案 1 :(得分:1)

只需使用

cursor.moveToFirst();
while (cursor.moveToNext()){
    //do something
}

在你的for循环中,你正在比较光标是不是afterlast,这意味着,如果它是最后一个,它仍将执行moveToNext,它不存在

或者如果您想坚持使用for循环,只需替换

!cursor.isAfterLast()

!cursor.isLast()