Updating listView without duplication

别说谁变了你拦得住时间么 提交于 2019-12-12 05:36:50

问题


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


    }

回答1:


  1. 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);
        }
      }
    }
    
  2. 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.
    }
    }
    


来源:https://stackoverflow.com/questions/41026692/updating-listview-without-duplication

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!