2016-12-07 2 views
0

Я пишу приложение для музыкального плеера с плейлистами, и я пытаюсь отобразить песни, которые были выбраны. Весь код для этого отлично работает, но когда добавлена ​​песня, listView не будет обновляться. Я много раз искал онлайн, но не могу понять, как это исправить. В конце концов я пытаюсь вызвать leftAdapter.notifyDataSetChanged();, чтобы обновить список, но он выдает ошибку:Обновление спискаView без дублирования

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

Я также пытался вызвать метод INITIALIZING (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; 
     } 


    } 
+0

@AlexCollete. Позвольте мне увидеть ваш код адаптера. В коде Db Helper нет ничего плохого. Но я хочу посмотреть, как вы обновляете свой адаптер и ваши конструкторы. –

+0

где вы проходите db.getAllsongs() для вашего адаптера? вы просто вызвали функцию, но ничего не сделали со списком , возвращаемым методом. – Nitesh

+0

Возможный дубликат [Что такое исключение NullPointerException и как его исправить?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – dsh

ответ

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. Затем создайте класс и класс адаптера и следуйте рисунку.

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

В настоящее время у меня есть адаптер с именем SongAdapter, вот код для этого: –

+0

@AlexCollette. если вы посмотрите на код примера, который я написал выше для вас. Это выглядит почти точно с тем, что у вас есть в вашем адаптере. Поэтому просто скопируйте и вставьте мой код выше для активности и адаптера, и все должно работать хорошо. –

+0

Как мне вызвать метод updateSongView()? что с ним нужно пройти? благодаря! –