0

アプリケーションで本の表紙の画像を 3 行表示するために gridview を使用しています。本はデータベースから取得され、本が選択されると別のアクティビティで開かれます。本のない画面で指を押したままにすると、アプリケーションがクラッシュし、以下のログ キャットに示すように CursorIndexOutOfBoundsException が発生します。 . グリッドビューがクリックされたときのコードは次のとおりです。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Cursor cursor = mGridAdapter.getCursor();
    cursor.moveToPosition(position);

    boolean downloaded = cursor.getInt(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_DOWNLOADED)) == 1;

    String remoteFilename = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_REMOTE_FILENAME));
    int grade = cursor.getInt(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_GRADE));

    if (!downloaded) {
        String isbn = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_ISBN));
        String title = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_TITLE));

        ProgressBar currentProgressBar = (ProgressBar) view.findViewById(R.id.progressBarBookDownload);
        mProgressBarMap.put(isbn, currentProgressBar);

        ImageView imgCover = (ImageView) view.findViewById(R.id.imageViewCover);
        mCoverImageMap.put(isbn, imgCover);
        ImageView imgDownloadIcon = (ImageView) view.findViewById(R.id.imageViewDownloadIcon);
        mDownloadIconMap.put(isbn, imgDownloadIcon);
        imgDownloadIcon.setVisibility(View.INVISIBLE);

        String url = getBookCdnUrl(remoteFilename, grade);

        Bundle extras = new Bundle();
        extras.putString(DownloadTask.PARAM_URL, url);
        extras.putString(DatabaseHelper.COLUMN_BOOK_ISBN, isbn);
        extras.putString(DatabaseHelper.COLUMN_BOOK_TITLE, title);

        mTaskHandler = Groundy.create(DownloadTask.class).callback(this).args(extras).queue(this);
        mDownloadList.put(isbn, remoteFilename);
    }

    // book has already been downloaded, woop
    else {
        Log.d(TAG, "Clicked book is " + mFile.getAbsolutePath() + "/" + remoteFilename);

        openBook(remoteFilename, mFile.getAbsolutePath() + "/" + remoteFilename);
    }

    Log.d(TAG, "Book Selected: " + ((TextView) view.findViewById(R.id.textViewReadingLevel)).getText());
}

コードの先頭に if (cursor.getCount >= 0) のようないくつかのチェックを追加しようとしましたが、それでもまだ喜びです。誰がこれを引き起こしているのか知っていますか?

08-17 11:36:53.724: E/AndroidRuntime(4883): FATAL EXCEPTION: main
08-17 11:36:53.724: E/AndroidRuntime(4883): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 71
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at com.hmh.android.readers.MyReadersActivity$1.run(MyReadersActivity.java:940)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.os.Handler.handleCallback(Handler.java:605)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.os.Looper.loop(Looper.java:137)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at android.app.ActivityThread.main(ActivityThread.java:4533)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at java.lang.reflect.Method.invokeNative(Native Method)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at java.lang.reflect.Method.invoke(Method.java:511)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-17 11:36:53.724: E/AndroidRuntime(4883):     at dalvik.system.NativeStart.main(Native Method)

編集:問題は長押しが原因だと思います。画面を 3 秒間押し続けると、本が削除されます。本が見つからない場合、クラッシュします。以下のコードを参照してください。

public void run() {
            Log.i(TAG, "Long press! Pos:" + mGridTouchPosition);

            Cursor cursor = mGridAdapter.getCursor();
            cursor.moveToPosition(mGridTouchPosition);

            String remoteFilename = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_REMOTE_FILENAME));

            if (fileExistance(remoteFilename)) {
                View v;
                int pos = 0;

                v = mGridView.getChildAt(pos);

                while (!v.isPressed()) {
                    pos++;
                    v = mGridView.getChildAt(pos);
                }
                longPressedIsbn = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_BOOK_ISBN));

                deleteBook(v);
            }
        }
    };
4

1 に答える 1

0

カーソルを無効な位置に移動しようとしています: -1。無効な位置を無視すると、アプリはクラッシュしません。

Cursor cursor = mGridAdapter.getCursor();

if (position < 0 || cursor.getCount() <= position) {
return;
}


cursor.moveToPosition(position);
...
于 2013-08-17T10:53:01.320 に答える