如何使用notifyDataSetChanged以最简单的方式更新recyclerview

时间:2017-10-12 08:43:51

标签: android android-recyclerview

我尝试使用notifyDataSetChanged()更新我的recyclerview,但它不起作用。我正在将适配器设置为recyclerview,如下所示:

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false);
lstSong.setLayoutManager(mLayoutManager);
lstSong.setItemAnimator(new DefaultItemAnimator());
lstSong.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(0), true));

arrSong = new ArrayList<Song>();
arrSong = kFunc.getAllSong();
songAdapter = new SongAdapter(ctx, arrSong);
lstSong.setAdapter(songAdapter);

这行代码显示数据。但是,当我添加新数据并使用songAdapter.notifyDataSetChanged();刷新Recyclerview时,数据将不会显示。我知道我可以使用setAdapter()来显示它,但我想要正确地做到这一点。

我在进行刷新之前添加数据。这是代码:

kFunc = new Function(ctx);
Song song = new Song();
song.setTitle(title);
song.setArtist(artist);
song.setYear_released(yearReleased);
song.setAlbum(album);
song.setGenre(genre);
song.setDuration(duration);
song.setCode(code);
song.setLyrics(lyrics);

kFunc.addSong(song);
dialog.dismiss();

arrSong = kFunc.getAllSong();
songAdapter.notifyDataSetChanged();

3 个答案:

答案 0 :(得分:0)

在适配器中创建一个方法,如

public updateItems(ArrayList<Song> songs){
    arrSong=songs;
}

在类中获取新值时,使用adapdter对象调用方法

lstSong.updateItems(arrSong);
notifyDataSetChanged();

答案 1 :(得分:0)

我不知道您将新项目添加到RecyclerView.Adapter的位置。这是添加和设置项目的示例代码。更多细节Sample RecyclerViewAdapter

  @Override
  public void addItem(M item) {
    items.add(item);
    notifyItemInserted(items.size() - 1);
  }

  @Override
  public void addItem(int position, M item) {
    items.add(position, item);
    notifyItemInserted(position);
  }

  @Override
  public void addAllItems(List<M> items) {
    this.items.addAll(items);
    notifyDataSetChanged();
  }

  @Override
  public void setItems(List<M> items) {
    this.items = items;
    notifyDataSetChanged();
  }

答案 2 :(得分:0)

在通知适配器之前,您应该尝试更新歌曲列表。 例如

arraySongs = <retrive updated data of the song>; adapter.notifyDataStateChanged()

如果您在ListView中,那么您不是仅为您提供信息 adapter.lstSong =<updated songs List>; adapter.notifyDataStteChanged();

试试这个对我有用。 快乐的编码。 :)