更新listView没有重复

时间:2016-12-07 20:24:09

标签: java android listview android-arrayadapter

我正在编写带有播放列表的音乐播放器应用程序,我正在尝试显示已选择的歌曲。所有的代码都可以正常工作,但是当添加一首歌时,listView将不会更新。我已在网上广泛搜索,但无法弄清楚如何修复它。我最终试图调用leftAdapter.notifyDataSetChanged();来更新列表,但它会抛出错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ArrayAdapter.notifyDataSetChanged()' on a null object reference

我也试过调用初始化方法(createLeftList()),但它复制了列表中的所有项目。

调用初始化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的方法

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

修改后更新listview的方法:

public void updateLeftList(){

        leftAdapter.notifyDataSetChanged();

    }

非常感谢任何帮助!

这是我的SongAdapter代码:

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


    }

1 个答案:

答案 0 :(得分:0)

  1. 在您的活动类中执行此操作。

    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);
        }
      }
    }
    
  2. 然后创建和Adapter类并遵循模式。

    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.
    }
    }