You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:54:00