I am writing a music player application with playlists, and I am trying to display the songs that have been chosen. All of the code for that works fine, but when a song is added, the listView won't update. I have searched extensively online, but cannot figure out how to fix it. I ended up trying to call leftAdapter.notifyDataSetChanged();
to update the list, but it throws the error:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference
I have also tried calling the initializing method (createLeftList()
) but it duplicates all of the items in the list.
Method called to initialize listview:
public void createLeftList() {
DatabaseHandler db = new DatabaseHandler(this);
leftSongView = (ListView) findViewById(R.id.left_playlistView);
db.getAllsongs();
ArrayAdapter<String> leftAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ArrayofName);
leftSongView.setAdapter(leftAdapter);
leftSongView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(getApplicationContext(), ((TextView) v).getText(), Toast.LENGTH_SHORT).show();
}
});
}
Method to fetch list and send to listview
public List<LeftPlaylist> getAllsongs() {
List<LeftPlaylist> leftPlaylistList = new ArrayList<LeftPlaylist>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_PLAYLIST;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
LeftPlaylist leftPlaylist = new LeftPlaylist();
leftPlaylist.setID(Integer.parseInt(cursor.getString(0)));
leftPlaylist.setName(cursor.getString(1));
leftPlaylist.setPath(cursor.getString(2));
String name = cursor.getString(1) +"\n"+ cursor.getString(2);
ListenPage.ArrayofName.add(name);
// Adding song to list
leftPlaylistList.add(leftPlaylist);
} while (cursor.moveToNext());
}
Method called to update the listview after modifying it:
public void updateLeftList(){
leftAdapter.notifyDataSetChanged();
}
Any help would be greatly appreciated!
Here is my SongAdapter code:
public class SongAdapter extends BaseAdapter {
private ArrayList<Song> songs;
private LayoutInflater songInf;
public SongAdapter(Context c, ArrayList<Song>theSongs){
songs=theSongs;
songInf=LayoutInflater.from(c);
}
@Override
public int getCount() {
return songs.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//map to song layout
LinearLayout songLay = (LinearLayout)songInf.inflate
(R.layout.song, parent, false);
//get title and artist views
TextView songView = (TextView)songLay.findViewById(R.id.song_title);
TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
//get song using position
Song currSong = songs.get(position);
//get title and artist strings
songView.setText(currSong.getTitle());
artistView.setText(currSong.getArtist());
//set position as tag
songLay.setTag(position);
return songLay;
}
}