Fragment中增删播放列表后RecyclerView调用notifyDataSetChanged不更新问题
问题原因
- 你的创建、删除播放列表操作仅修改了系统MediaStore的持久化数据,没有同步更新RecyclerView Adapter持有的内存中
playlists列表 - 仅在Fragment初始化时调用过一次
notifyDataSetChanged(),后续数据变更没有主动触发适配器刷新逻辑
修复方案
步骤1:给PlaylistAdapter新增数据刷新方法
在PlaylistAdapter.java中添加如下公共方法,用于统一刷新列表数据:
public void refreshPlaylistData() { // 清空原有内存数据 playlists.clear(); // 重新从MediaStore拉取最新播放列表数据 PlayListMethodHolder.getplaylistList(mContext, playlists); // 通知适配器刷新UI notifyDataSetChanged(); }
步骤2:删除操作后触发刷新
修改PlaylistAdapter.java中删除播放列表的逻辑,操作完成后调用刷新方法:
case R.id.pDelete: PlayListMethodHolder.deletePlaylist(mContext, plistID); // 新增:刷新列表UI refreshPlaylistData(); break;
如果追求更好的刷新性能,也可以直接修改内存列表后定向刷新:
case R.id.pDelete: PlayListMethodHolder.deletePlaylist(mContext, plistID); // 直接移除内存中对应位置的条目 playlists.remove(position); // 定向刷新移除的位置,性能优于全量刷新 notifyItemRemoved(position); break;
步骤3:创建/重命名播放列表后触发刷新
在弹出PlayListPopDialog的位置添加关闭监听,弹窗操作完成后触发列表刷新:
PlayListPopDialog popDialog = new PlayListPopDialog(mContext, dpType, plistID, playlists); // 新增弹窗关闭监听 popDialog.setOnDismissListener(dialog -> { // 操作完成后刷新播放列表 playlistAdapter.refreshPlaylistData(); }); popDialog.show();
所有触发播放列表变更的弹窗都按照上述逻辑添加监听即可。
可选优化
Fragment初始化时setAdapter后不需要额外调用playlistAdapter.notifyDataSetChanged(),设置适配器时会自动触发首次渲染,这行代码可以直接删除。
内容的提问来源于stack exchange,提问作者HASAN
相关产品推荐
相关产品推荐

