2012-05-07 17 views
11

Tengo una actividad donde un viewflipper muestra una lista que contiene los artistas de mediastore, que en un clic hace una lista de álbumes el artista elegido, que a su vez muestra las canciones de ese álbum. Una vez que se hace clic en una canción, debe rellenar una vista de texto con la cadena 'título'.Error de cursor de Android: "asegúrese de que el cursor se inicialice correctamente antes de acceder a los datos ..."

Hasta este punto, todos los cursores funcionan bien, pero el último parece estar fuera de posición de alguna manera. ¿Podría alguien decirme por qué Logcat me está diciendo:

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. 

La fila en particular que no pueden ser leídos varía en función de los cuales se elige el artista/álbum/canción. El código es el siguiente. Muchas gracias por su ayuda.

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, si mi respuesta le ayuda hacia fuera/resuelto el problema, haga clic en la marca de verificación al lado para que obtenga crédito y todos los demás saben que su problema se ha resuelto. ¡Buena suerte! – Barak

+0

Barak, podría ver los comentarios a continuación, me gustaría obtener un poco más de información sobre cómo lograr el resultado deseado. –

+0

código ... el horror – slinden77

Respuesta

22

El problema no está en la fila, está en la columna.

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

Básicamente, dice que su columna MediaColumns.TITLE no existe en el cursor. Cual es verdad. No está en su primer cursor (al que hace referencia). Sus otros cursores están todos dentro de las declaraciones if, así que salga del alcance y deje solo el primero.

Puede volver a tirar del cursor como lo hace en las otras partes de la instrucción if, o encontrar la forma de mantener el cursor que obtuvo de la última instrucción if.

EDITAR

Es bastante sencillo de solucionar, hacer que el cursor una variable de clase. Además, no seguiría reutilizando el "cursor". Rotúelos individualmente y descriptivo, lo ayudará a mantener la legibilidad en su código. Podría hacerlo así:

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

Luego los llama como era pero usa los nombres individuales.

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

Ya que lo declaró como una variable de clase estará disponible a través de toda la clase por lo que en la última parte que haría:

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

Gracias por su respuesta, Barak. He estado jugando con esta idea, pero parece que no puedo hacer que nada funcione. Incluso he vuelto a tirar del cursor exactamente como lo hizo la declaración anterior, pero obtengo el mismo error. Estoy pensando que es porque la 'posición' ha cambiado. ¿Podrías quizás mostrarme cómo podrías lograr esto? Gracias. –

+0

Actualizado mi respuesta. – Barak

+0

Gracias, Barak, muy apreciado. –

Cuestiones relacionadas