java.lang.IllegalStateException: не удалось переместить курсор в позицию n

Я пытаюсь импортировать контакты и отображать их в файле 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);

И мой адаптер

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

Мой код вылетает, когда ListView доходит до конца. Если есть 2 контакта, я получаю сообщение об ошибке java.lang.IllegalStateException: не удалось переместить курсор в позицию 2, и аналогично, если у меня есть n контактов. Я видел этот вопрос, но не нашел там ответа. Пожалуйста помоги

Вот журнал

------------- beginning of crash
04-19 14:56:41.583 28188-28188/in.nuventure.com.wedding E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.nuventure.com.wedding, PID: 28188
java.lang.IllegalStateException: couldn't move cursor to position 2
      at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:248)
      at android.widget.AbsListView.obtainView(AbsListView.java:2347)
      at android.widget.ListView.makeAndAddView(ListView.java:1864)
      at android.widget.ListView.fillDown(ListView.java:698)
      at android.widget.ListView.fillFromTop(ListView.java:759)
      at android.widget.ListView.layoutChildren(ListView.java:1659)
      at android.widget.AbsListView.onLayout(AbsListView.java:2151)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
      at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
      at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
      at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1037)
      at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:747)
      at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:761)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1043)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
      at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
      at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
      at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
      at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
      at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
      at android.view.View.layout(View.java:15671)
      at android.view.ViewGroup.layout(ViewGroup.java:5038)
      at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
      at android.view.Choreographer.doCallbacks(Choreographer.java:580)
      at android.view.Choreographer.doFrame(Choreographer.java:550)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.Acti

04-19 14:56:47.361 28188-28200/in.nuventure.com.wedding W/CursorWrapperInner: Cursor finalized without prior close()

вот скриншот logcat

Я не мог найти отображаемую строку ошибки. это меня смущает


person Sudheer K    schedule 19.04.2016    source источник
comment
подсчет позиций начинается с нуля, поэтому, если у вас есть 2 позиции, то первая будет 0 (ноль), а вторая 1 (единица). Вы пытаетесь получить позицию, которой нет (в вашем случае это будет третья).   -  person Opiatefuchs    schedule 19.04.2016
comment
какая строка является точной строкой ошибки?   -  person Opiatefuchs    schedule 19.04.2016
comment
я загрузил лог   -  person Sudheer K    schedule 19.04.2016
comment
важная часть отсутствует в логарифме. Последняя строка, которую я вижу здесь в вашем посте, указывает на строку с ошибкой, пожалуйста, прикрепите еще раз....   -  person Opiatefuchs    schedule 19.04.2016
comment
Logcat отображает только это.   -  person Sudheer K    schedule 19.04.2016
comment
затем прокрутите вниз. посмотри сюда: at android.app.Acti ..последняя строка и она не полная....   -  person Opiatefuchs    schedule 19.04.2016
comment
см. Я загрузил скриншот logcat   -  person Sudheer K    schedule 19.04.2016
comment
ну, по какой-то причине это отрезано. может быть, это поможет, если вы переключитесь с Debug на Verbose и снова воспроизведете проблему...   -  person Opiatefuchs    schedule 19.04.2016
comment
и я думаю, что будет лучше, если вы получите количество курсоров для цикла for с помощью phoneCursor.getCount() , а затем цикла for: for(int i=0;i>count;i++){} . В API isAfterLast() возвращает логическое значение для whether the cursor is after the last result . Поэтому я не уверен, считает ли курсор элемент, которого там нет.   -  person Opiatefuchs    schedule 19.04.2016
comment
Да, проблема была с моим getcount(), который вернул names.size()   -  person Sudheer K    schedule 19.04.2016


Ответы (2)


Спасибо за вашу помощь. Эта проблема была с getCount(). Я делал это раньше, а потом не замечал.

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

Я удалил это, и это работает нормально. Спасибо за вашу помощь

person Sudheer K    schedule 19.04.2016

Просто используйте

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

В вашем цикле for вы сравниваете, не является ли курсор последним, это означает, что если он последний, он все равно будет выполнять moveToNext, которого не существует

Или, если вы хотите придерживаться цикла for, просто замените

!cursor.isAfterLast()

с

!cursor.isLast()
person Ricardo    schedule 19.04.2016