更新listView而不重复 [英] Updating listView without duplication

查看:73
本文介绍了更新listView而不重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写带有播放列表的音乐播放器应用程序,并且试图显示已选择的歌曲.所有的代码都可以正常工作,但是添加歌曲时,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;
        }


    }

推荐答案

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

  • 然后创建并创建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而不重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆