Android cursor Fehler "stellen Sie sicher, dass der cursor wird korrekt initialisiert, bevor der Zugriff auf Daten von..."
Ich habe eine Tätigkeit, bei der ein viewflipper zeigt eine Liste mit den Künstlern aus mediastore, die onitem klicken Sie auf die Anzeige einer Liste der Alben des ausgewählten Künstlers, die wiederum zeigt die songs auf diesem album. Wenn ein song angeklickt wird, sollte es füllen eine textview mit der Zeichenkette 'title'.
Bis zu diesem Zeitpunkt alle der Cursor arbeiten gut, aber der Letzte scheint setzen sich aus der position irgendwie. Könnte mir jemand sagen, warum logcat sagt mir:
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.
Die bestimmte Zeile, die nicht gelesen werden können, variiert je nachdem, welche Künstler/album/song gewählt wird. Der code ist wie folgt. Ich danke Ihnen sehr für Ihre Hilfe.
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);
}
}
}
}
Barak, könntest du bitte sehen Sie die Kommentare unten, ich hätte gerne ein bisschen mehr info auf, wie das gewünschte Ergebnis zu erzielen..
InformationsquelleAutor | 2012-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem nicht in der Zeile, in der Spalte.
Es ist im Grunde sagen, dass Ihre MediaColumns.TITEL-Spalte nicht vorhanden cursor. Das ist wahr. Es ist nicht in Ihrem ersten cursor (die es verweist). Ihre andere Cursor sind alle innerhalb
if
Aussagen, so dass außerhalb des Bereichs und lassen Sie nur die erste.Können Sie entweder erneut ziehen Sie den cursor, wie Sie auch in die anderen Teile der
if
- Anweisung, oder einen Weg finden, bestehen Sie den cursor aus dem letztenif
- Anweisung.BEARBEITEN
Es ist ziemlich einfach zu beheben, stellen Sie den cursor eine Klasse variable. Auch würde ich Sie nicht erneut mit "cursor". Beschriften Sie Sie, somethign individuelle und beschreibende, es wird Ihnen helfen, die Lesbarkeit Ihres Codes. Ich könnte es so machen:
Dann rufen Sie Sie wie Sie waren, aber die einzelnen Namen.
Da Sie deklariert es als Klassenvariable wird es durch die ganze Klasse, also in den letzten Teil, den Sie tun würde:
Aktualisiert meine Antwort.
Dank Haufen Barak, sehr geschätzt.
InformationsquelleAutor Barak