2015-07-11 5 views
0

Я пытаюсь отправить ArrayList пользовательского объекта. Таким образом, я сделал свой класс Parcelable. Вот мой класс:nullReference While Iterating Cursor

package com.abhi8569.musicplayer; 

import android.content.ContentResolver; 
import android.content.ContentUris; 
import android.content.Context; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Parcel; 
import android.os.Parcelable; 

import java.io.InputStream; 
public class SongInformation implements Parcelable { 

private int albumID; 
private String queryTitle; 
private String queryAlbum; 
private String queryArtist; 
private int queryDuration; 
private String filepath; 
private String _id; 


public int getAlbumID() { 
    return albumID; 
} 

public void setAlbumID(int albumID) { 
    this.albumID = albumID; 
} 

public SongInformation(Cursor cursor) { 
    albumID=cursor.getInt(0); 
    queryTitle = cursor.getString(1); 
    queryArtist = cursor.getString(2); 

    queryAlbum = cursor.getString(3); 
    queryDuration = cursor.getInt(4); 
    filepath = cursor.getString(5); 
    _id = cursor.getString(6); 

} 
public String getQueryAlbum() { 
    return queryAlbum; 
} 

public void setQueryAlbum(String queryAlbum) { 
    this.queryAlbum = queryAlbum; 
} 

public String getQueryArtist() { 
    return queryArtist; 
} 

public void setQueryArtist(String queryArtist) { 
    this.queryArtist = queryArtist; 
} 

public int getQueryDuration() { 
    return queryDuration; 
} 

public void setQueryDuration(int queryDuration) { 
    this.queryDuration = queryDuration; 
} 

public String getFilepath() { 
    return filepath; 
} 

public void setFilepath(String filepath) { 
    this.filepath = filepath; 
} 

public String get_id() { 
    return _id; 
} 

public void set_id(String _id) { 
    this._id = _id; 
} 

public String getQueryTitle() { 
    return queryTitle; 
} 

public void setQueryTtile(String queryTitle) { 
    this.queryTitle = queryTitle; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(this.albumID); 
    dest.writeString(this.queryTitle); 
    dest.writeString(this.queryAlbum); 
    dest.writeString(this.queryArtist); 
    dest.writeInt(this.queryDuration); 
    dest.writeString(this.filepath); 
    dest.writeString(this._id); 
} 

protected SongInformation(Parcel in) { 
    this.albumID = in.readInt(); 
    this.queryTitle = in.readString(); 
    this.queryAlbum = in.readString(); 
    this.queryArtist = in.readString(); 
    this.queryDuration = in.readInt(); 
    this.filepath = in.readString(); 
    this._id = in.readString(); 
} 

public static final Parcelable.Creator<SongInformation> CREATOR = new Parcelable.Creator<SongInformation>() { 
    public SongInformation createFromParcel(Parcel source) { 
     return new SongInformation(source); 
    } 

    public SongInformation[] newArray(int size) { 
     return new SongInformation[size]; 
    } 
}; 
} 

До сих пор у меня есть вся моя музыка. Информация хранится в курсоре. Я хочу, чтобы сохранить его в ArrayList, так что я пытаюсь преобразовать курсор в ArrayList, используя этот код:

public class SongsTab extends Fragment implements AdapterView.OnItemClickListener { 

ListView lv; 
Cursor cu; 
View v; 
ArrayList<SongInformation> sendSongsArrayToPlayNow; 
SongListViewAdapter adapt; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.activity_songs_tab, container, false); 

    lv = (ListView) v.findViewById(R.id.songs_tab_listView); 
    new MyTask().execute(); 
    lv.setOnItemClickListener(this); 

    return v; 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    int pos = position; 
    cu.moveToFirst(); 
    while (cu.moveToNext()) { 
     sendSongsArrayToPlayNow.add(new SongInformation(cu)); 
    } 
    Intent i = new Intent(getActivity(), PlayingNow.class); 
    i.putExtra("type", "songs"); 
    i.putParcelableArrayListExtra("data", sendSongsArrayToPlayNow); 
    i.putExtra("position", pos); 
    startActivity(i); 
} 

class MyTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     cu = MainActivity.getMusicCursorFromMainActivity(); 
     adapt = new SongListViewAdapter(v.getContext(), cu); 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     lv.setAdapter(adapt); 
    } 

} 
} 

Когда я запустить приложение, я могу заполнить список View с помощью адаптера. Значит, у меня есть курсор. Теперь После нажатия ListItem я получаю nullReference исключение в этой строке:

sendSongsArrayToPlayNow.add(new SongInformation(cu)); 

При отладке я могу видеть, что курсор имеет счетчик 87, т.е. он был инициализирован. Где я делаю неправильно?

+1

Проблема не с курсором, а с 'sendSongsArrayToPlayNow'. Он не инициализирован. – Codebender

ответ

0

Изменить

ArrayList<SongInformation> sendSongsArrayToPlayNow; 

в

ArrayList<SongInformation> sendSongsArrayToPlayNow = new ArrayList<SongInformation>(); 

Вы должны связать свою ссылочную переменную в new ArrayList<>()!

+0

oops ... Я пропустил это. Спасибо! – abhi8569