问题描述
我正在编写带有播放列表的音乐播放器应用程序,并且试图显示已选择的歌曲.所有的代码都可以正常工作,但是添加歌曲时,listView不会更新.我已经在网上进行了广泛的搜索,但是不知道如何解决它.我最终尝试调用leftAdapter.notifyDataSetChanged();
来更新列表,但是它引发了错误:
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
我也尝试过调用初始化方法(createLeftList()
),但它会复制列表中的所有项目.
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();
}
});
}
获取列表并发送到listview的方法
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();
}
任何帮助将不胜感激!
这是我的SongAdapter代码:
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;
}
}
推荐答案
-
在您的活动课堂中执行此操作.
Do this in your Activity Class.
public class MyActivity extends Activity {
private SongListAdapter _songListAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createLeftList();
}
private void createLeftList(){
DatabaseHandler db = new DatabaseHandler(this);
ListView leftSongView = (ListView) findViewById(R.id.left_playlistView);
_songListAdapter = new SongListAdapter(this, db.getAllsongs());
leftSongView.setAdapter(_songListAdapter);
}
//TODO use this whenever you wanna update your list.
public void updateSongView(List<String> songsList){
if(_songListAdapter != null && songsList != null){
_songListAdapter.updateMusicList(songsList);
}
}
}
然后创建并创建Adapter类,并遵循该模式.
Then create and Adapter class and follow the pattern.
public class SongListAdapter extends BaseAdapter{
private Context _context;
private List<String> musicList = new ArrayList();
public SongListAdapter(Context context, List<String> musicList){
_context = context;
this.musicList.clear();
this.musicList.addAll(musicList);
}
public void updateMusicList(List<String> musicList){
this.musicList.clear();
this.musicList.addAll(musicList);
notifyDataSetChanged();
}
@Override
public int getCount() {
return musicList.size();
}
@Override
public Object getItem(int position) {
return musicList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(_context).inflate(R.layout.music_view, parent, false);
// TODO folow view holder pattern.
}
String music = (String) getItem(position);
if(music != null){
//TODO update your views Here
}
return convertView;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
//TODO peform any custon action when this is called if needed.
}
}
这篇关于更新listView而不重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!