2013-08-17 30 views
0

我正在使用gridview在我的應用程序中顯示3行書封面圖像。這些書籍是從數據庫中檢索出來的,當選擇一本書時,它會在另一個activity中打開。如果你的手指放在沒有書的屏幕上,那麼我的應用程序崩潰,並且我得到一個CursorIndexOutOfBoundsException,如下面的log cat所示。這是我點擊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()); 
} 

我曾試過把我的代碼一樣,如果(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); 
      } 
     } 
    }; 

回答

0

您正在嘗試將光標移到無效的位置:-1。忽略無效位置,您的應用不會崩潰。

Cursor cursor = mGridAdapter.getCursor(); 

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


cursor.moveToPosition(position); 
... 
+0

我試過了,但應用程序仍然崩潰,並在日誌中出現同樣的錯誤 – DMC

+0

您重建(清潔)它嗎?我會在一分鐘後再看看你的問題。 – Rayne

+0

我假設第940行是'cursor.moveToPosition(position);'? – Rayne