Android 安卓光标错误-“;在从光标访问数据之前,请确保光标已正确初始化……”;

Android 安卓光标错误-“;在从光标访问数据之前,请确保光标已正确初始化……”;,android,listview,cursor,viewflipper,mediastore,Android,Listview,Cursor,Viewflipper,Mediastore,我有一个活动,其中一个viewflipper显示一个包含mediastore艺术家的列表,单击该列表显示所选艺术家的专辑列表,然后依次显示该专辑中的歌曲。单击歌曲后,应使用字符串“title”填充textview 在这之前,所有的游标都工作得很好,但最后一个似乎不知何故被放错了位置。谁能告诉我为什么logcat会告诉我: 05-07 23:58:54.195: E/AndroidRuntime(1961): java.lang.IllegalStateException: Couldn't re

我有一个活动,其中一个viewflipper显示一个包含mediastore艺术家的列表,单击该列表显示所选艺术家的专辑列表,然后依次显示该专辑中的歌曲。单击歌曲后,应使用字符串“title”填充textview

在这之前,所有的游标都工作得很好,但最后一个似乎不知何故被放错了位置。谁能告诉我为什么logcat会告诉我:

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.
无法读取的特定行因选择的艺术家/专辑/歌曲而异。代码如下。非常感谢你的帮助

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

            }
        }
    }
}
package music.flipper;
导入android.app.Activity;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.provider.BaseColumns;
导入android.provider.MediaStore;
导入android.provider.MediaStore.Audio.album列;
导入android.provider.MediaStore.Audio.ArtistColumns;
导入android.provider.MediaStore.Audio.AudioColumns;
导入android.provider.MediaStore.MediaColumns;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.ListView;
导入android.widget.SimpleCursorAdapter;
导入android.widget.TextView;
导入android.widget.ViewFlipper;
公共类MusicFlipper扩展活动实现了McClickListener{
/**在首次创建活动时调用*/
查看翻转器查看翻转器;
光标;
私有字符串currentList=“Artist”;
@抑制警告(“弃用”)
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.flipper);
//将主视图设置为flipper。
viewflipper=(viewflipper)findViewById(R.id.viewFlipper1);
字符串[]列={
BaseColumns.\u ID,
艺术家
};
//为每行返回的列。
游标=managedQuery(MediaStore.Audio.Artists.EXTERNAL\u CONTENT\u URI,
列,null,null,null);
ListView ListView=(ListView)findViewById(R.id.listView1);
setOnItemClickListener(this);
//将侦听器设置为flipper中的第一个listview
字符串[]显示字段=新字符串[]{ArtistColumns.ARTIST};
//将所有艺术家名称设置为数组“displayfields”
int[]displayViews=newint[]{R.id.rowItem};
//要显示的行数和绑定它们的位置
SimpleCrsorAdapter=新的SimpleCrsorAdapter(此,
R.layout.row_项目、光标、显示字段、显示视图);
setAdapter(适配器);}
//获取显示字段数组,并绑定到匹配的显示行
@抑制警告(“弃用”)
公共视图单击(适配器视图a、视图v、内部位置、长id){
if(currentList.equals(“艺术家”)){
if(光标移动位置(位置)){
//单击项目后,将光标移动到该项目的位置
字符串,其中=AudioColumns.ARTIST+“=?”;
//光标是否位于艺术家行内?
字符串,其中val[]={cursor.getString(cursor
.getColumnIndex(AlbumColumns.ARTIST))};
//选择具有所选艺术家姓名的特定行
字符串[]列={
BaseColumns.\u ID,
AudioColumns.ALBUM,
};
字符串orderBy=BaseColumns.\u ID;
游标=managedQuery(MediaStore.Audio.Albums.EXTERNAL\u CONTENT\u URI,
列,其中,whereVal,orderBy);
ListView ListView=(ListView)findViewById(R.id.listView2);
setOnItemClickListener(this);
字符串[]显示字段=新字符串[]{AudioColumns.ALBUM};
int[]displayViews=newint[]{R.id.rowItem};
SimpleCrsorAdapter=新的SimpleCrsorAdapter(此,
R.layout.row_项目、光标、显示字段、显示视图);
setAdapter(适配器);
currentList=“相册”;
viewflipper.showNext();}
}if(currentList.equals(“相册”)){
if(光标移动位置(位置)){
字符串,其中=AudioColumns.ALBUM
+ "=?";
字符串,其中val[]={cursor.getString(cursor
.getColumnIndex(AlbumColumns.ALBUM))};
字符串[]列={
MediaColumns.DATA,
BaseColumns.\u ID,
MediaColumns.TITLE,
MediaColumns.DISPLAY_NAME,
MediaColumns.MIME_类型,
};
字符串orderBy=MediaColumns.TITLE;
游标=managedQuery(MediaStore.Audio.Media.EXTERNAL\u CONTENT\u URI,
列,其中,whereVal,orderBy);
ListView ListView=(ListView)findViewById(R.id.listView3);
setOnItemClickListener(this);
字符串[]显示字段=新字符串[]{MediaColumns.TITLE};
int[]displayViews=newint[]{R.id.rowItem};
SimpleCrsorAdapter=新的SimpleCrsorAdapter(此,
R.layout.row_项目、光标、显示字段、显示视图);
setAdapter(适配器);
currentList.equals(“歌曲”);
viewflipper.showNext();}
}if(currentList.equals(“歌曲”)){
if(光标移动位置(位置)){
String title=cursor.getString(cursor.getColumnIndex(MediaColumns.title));
TextView myTextView=(TextView)findViewById(R.id.title);
myTextView.setText(标题);
}
}
}
}
问题
Couldn't read row 3, **col -1** from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
public class MusicFlipper extends Activity implements OnItemClickListener {
    private Cursor artistCursor;
    private Cursor albumCursor;
albumCursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                columns, where, whereVal, orderBy);
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);
    }
}