Erro de cursor do Android - "verifique se o cursor foi inicializado corretamente antes de acessar dados dele ..."

Eu tenho uma atividade onde um viewflipper mostra uma lista contendo os artistas da mediastore, que um clique exibe uma lista de álbuns do artista escolhido, que por sua vez exibe as músicas desse álbum. Quando uma música é clicada, ela deve preencher uma visão de texto com a string 'title'.

Até este ponto, todos os cursores estão funcionando bem, mas o último parece estar fora de posição de alguma forma. Alguém poderia me dizer por que o logcat está me dizendo:

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.

A linha específica que não pode ser lida varia dependendo de qual artista / álbum / música for escolhido. O código é o seguinte. Muito obrigado pela sua ajuda.

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

            }
        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion