2012-05-07 20 views
11

Tôi có một hoạt động trong đó trình xem ảnh hiển thị danh sách chứa các nghệ sĩ từ trung tâm, mà onitem nhấp vào hiển thị danh sách album nghệ sĩ được chọn, lần lượt hiển thị các bài hát trong album đó. Khi một bài hát được nhấp vào, nó sẽ điền một textview với chuỗi 'title'.Lỗi con trỏ trên Android - "đảm bảo con trỏ được khởi chạy chính xác trước khi truy cập dữ liệu từ nó ..."

Cho đến thời điểm này, tất cả các con trỏ đều hoạt động tốt, nhưng cái cuối cùng dường như bị loại bỏ khỏi vị trí nào đó. Bất cứ ai có thể cho tôi biết lý do tại sao logcat nói với tôi:

05-07 23:58:54.195: E/AndroidRuntime(1961): java.lang.IllegalStateException: Couldn't read row 3, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Hàng cụ thể không thể đọc khác nhau tùy thuộc vào ca sĩ/album/bài hát được chọn. Mã như sau. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn.

package music.flipper; 

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.provider.BaseColumns; 
import android.provider.MediaStore; 
import android.provider.MediaStore.Audio.AlbumColumns; 
import android.provider.MediaStore.Audio.ArtistColumns; 
import android.provider.MediaStore.Audio.AudioColumns; 
import android.provider.MediaStore.MediaColumns; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 
import android.widget.ViewFlipper; 

public class MusicFlipper extends Activity implements OnItemClickListener { 
    /** Called when the activity is first created. */ 

    ViewFlipper viewflipper; 
    Cursor cursor; 

    private String currentList = "Artist"; 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

     setContentView(R.layout.flipper); 
     //set the main view to flipper. 
     viewflipper = (ViewFlipper) findViewById(R.id.viewFlipper1); 

     String[] columns = { 
       BaseColumns._ID, 
       ArtistColumns.ARTIST 
       }; 
     //The columns to return for each row. 

     cursor = managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, 
      columns, null, null, null); 

     ListView listView = (ListView) findViewById(R.id.listView1); 
     listView.setOnItemClickListener(this); 

     //set an onitemclicklistener to the first listview in flipper 

     String[] displayFields = new String[] { ArtistColumns.ARTIST }; 
     //set all the artist names to the array 'displayfields' 
     int[] displayViews = new int[] { R.id.rowItem }; 
     //number of rows to display and where to bind them 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.row_item, cursor, displayFields, displayViews); 
     listView.setAdapter(adapter); } 
     //Take the display fields array, and bind to the matching display row 

    @SuppressWarnings("deprecation") 

    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 

     if(currentList.equals("Artist")) { 
      if (cursor.moveToPosition(position)) { 
      //once an item is clicked, move the cursor to that items position 

      String where = AudioColumns.ARTIST + "=?"; 
      // Have the cursor look within the artist row? 

      String whereVal[] = { cursor.getString(cursor 
      .getColumnIndex(AlbumColumns.ARTIST)) }; 
      //Choose the particular row with the chosen artist's name 

      String[] columns = { 
        BaseColumns._ID, 
        AudioColumns.ALBUM, 
       }; 

       String orderBy = BaseColumns._ID; 

      cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
       columns, where, whereVal, orderBy); 

      ListView listView = (ListView) findViewById(R.id.listView2); 
      listView.setOnItemClickListener(this); 
      String[] displayFields = new String[] { AudioColumns.ALBUM }; 
      int[] displayViews = new int[] { R.id.rowItem }; 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       R.layout.row_item, cursor, displayFields, displayViews); 
      listView.setAdapter(adapter); 
      currentList = "Album"; 
      viewflipper.showNext();} 

     } if (currentList.equals("Album")) { 
      if (cursor.moveToPosition(position)) { 

       String where = AudioColumns.ALBUM 
       + "=?"; 

       String whereVal[] = { cursor.getString(cursor 
       .getColumnIndex(AlbumColumns.ALBUM)) }; 

       String[] columns = { 
         MediaColumns.DATA, 
         BaseColumns._ID, 
         MediaColumns.TITLE, 
         MediaColumns.DISPLAY_NAME, 
         MediaColumns.MIME_TYPE, 
        }; 

        String orderBy = MediaColumns.TITLE; 

       cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
        columns, where, whereVal, orderBy); 

       ListView listView = (ListView) findViewById(R.id.listView3); 
       listView.setOnItemClickListener(this); 
       String[] displayFields = new String[] { MediaColumns.TITLE }; 
       int[] displayViews = new int[] { R.id.rowItem }; 
       SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        R.layout.row_item, cursor, displayFields, displayViews); 
       listView.setAdapter(adapter); 
       currentList.equals("Songs"); 
       viewflipper.showNext();} 


     } if (currentList.equals("Songs")) { 
      if (cursor.moveToPosition(position)) { 

       String title = cursor.getString(cursor.getColumnIndex(MediaColumns.TITLE)); 

       TextView myTextView = (TextView) findViewById(R.id.title); 
       myTextView.setText(title); 

      } 
     } 
    } 
} 
+0

Hey timusus, nếu câu trả lời của tôi sẽ giúp bạn ra/vào giải quyết vấn đề, vui lòng nhấp vào dấu kiểm bên cạnh nó để tôi nhận được tín dụng và mọi người khác biết rằng vấn đề của bạn đã được giải quyết. Chúc may mắn! – Barak

+0

Barak, bạn có thể vui lòng xem các bình luận dưới đây, tôi muốn có thêm một chút thông tin về cách đạt được kết quả mong muốn .. –

+0

mã ... kinh dị – slinden77

Trả lời

22

Sự cố không nằm trong hàng, nó nằm trong cột.

Couldn't read row 3, **col -1** from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Về cơ bản, cột MediaColumns.TITLE của bạn không tồn tại trong con trỏ. Cái nào đúng. Nó không nằm trong con trỏ đầu tiên của bạn (con trỏ mà nó đang tham chiếu). Các con trỏ khác của bạn là tất cả trong các câu lệnh if vì vậy hãy vượt quá phạm vi và chỉ để lại các câu lệnh đầu tiên.

Bạn có thể kéo lại con trỏ như bạn thực hiện trong các phần khác của câu lệnh if hoặc tìm cách nào đó để duy trì con trỏ bạn nhận được từ câu lệnh if cuối cùng.

EDIT

Nó khá đơn giản để khắc phục, bạn con trỏ một biến lớp. Ngoài ra, tôi sẽ không tiếp tục sử dụng lại "con trỏ". Gắn nhãn cho họ một cách riêng biệt và mô tả, nó sẽ giúp bạn duy trì khả năng đọc trong mã của bạn. Tôi có thể làm như sau:

public class MusicFlipper extends Activity implements OnItemClickListener { 
    private Cursor artistCursor; 
    private Cursor albumCursor; 

Sau đó, bạn gọi cho họ giống như bạn nhưng sử dụng tên riêng lẻ.

albumCursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       columns, where, whereVal, orderBy); 

Vì bạn tuyên bố nó như là một biến lớp nó sẽ có sẵn thông qua cả lớp như vậy trong phần cuối cùng bạn muốn làm:

if (currentList.equals("Songs")) { 
    if (albumCursor.moveToPosition(position)) { 
      String title = albumCursor.getString(albumCursor.getColumnIndex(MediaColumns.TITLE)); 
      TextView myTextView = (TextView) findViewById(R.id.title); 
      myTextView.setText(title); 
    } 
} 
+0

Cảm ơn câu trả lời của bạn Barak. Tôi đã chơi đùa với ý tưởng này, nhưng dường như tôi không thể làm được gì. Tôi thậm chí đã kéo lại con trỏ chính xác như câu lệnh trước đã làm, nhưng tôi nhận được cùng một lỗi. Tôi nghĩ đó là vì 'vị trí' đã thay đổi. Có lẽ bạn có thể chỉ cho tôi cách bạn có thể đạt được điều này? Cảm ơn. –

+0

Đã cập nhật câu trả lời của tôi. – Barak

+0

Cảm ơn heaps Barak, được nhiều người đánh giá cao. –

Các vấn đề liên quan