如何在Fragment的onResume方法中实现页面数据刷新?
如何在Fragment的onResume中刷新收藏列表数据
你的问题核心是:favouriteList在其他Activity中更新后,当前Fragment的RecyclerView没有同步刷新——因为只有在onCreateView初始化Adapter时才会绑定初始数据,onResume中更新列表后没有通知Adapter数据变化。
解决方案步骤
- 将Adapter声明为Fragment的成员变量,避免每次
onCreateView都创建新实例 - 在
onResume中更新Adapter的数据源,并通知Adapter刷新UI - (可选)使用DiffUtil实现高效局部刷新,提升性能
修改后的代码实现
1. 调整Fragment中的Adapter声明与初始化
class FavouritesFragment : Fragment() { private var _binding: FragmentFavouritesBinding? = null private val binding get() = _binding!! // 声明Adapter为成员变量 private lateinit var cardAdapter: CardAdapter override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentFavouritesBinding.inflate(inflater, container, false) // 初始化Adapter并绑定到RecyclerView cardAdapter = CardAdapter(favouriteList, this) binding.recyclerView.apply{ layoutManager = GridLayoutManager(activity, 2) adapter = cardAdapter } return binding.root } override fun onResume() { super.onResume() orderFavourites() sortFavourites() // 更新Adapter的数据源并通知刷新 cardAdapter.updateData(favouriteList) if(favouriteList.isEmpty()){ Toast.makeText(context,"No Favourites Found", Toast.LENGTH_SHORT).show() } else { Toast.makeText(context,"resumed", Toast.LENGTH_SHORT).show() } } override fun onDestroyView() { super.onDestroyView() _binding = null } }
2. 在CardAdapter中添加数据更新方法
class CardAdapter( private var dataList: List<YourDataType>, // 替换为你的实际数据类型 private val fragment: FavouritesFragment ) : RecyclerView.Adapter<CardAdapter.ViewHolder>() { // --- 保留你原有的ViewHolder、onCreateViewHolder、onBindViewHolder实现 --- // 添加数据更新方法 fun updateData(newData: List<YourDataType>) { dataList = newData // 通知Adapter数据已变化,刷新整个列表 notifyDataSetChanged() } }
3. (可选)用DiffUtil实现高效局部刷新
如果列表数据量大,notifyDataSetChanged会刷新整个列表,性能较差,建议用DiffUtil只刷新变化的项:
fun updateData(newData: List<YourDataType>) { val diffCallback = object : DiffUtil.Callback() { override fun getOldListSize() = dataList.size override fun getNewListSize() = newData.size // 判断两个Item是否为同一个(通常用唯一ID) override fun areItemsTheSame(oldPos: Int, newPos: Int): Boolean { return dataList[oldPos].id == newData[newPos].id // 替换为你的数据ID判断逻辑 } // 判断Item内容是否相同 override fun areContentsTheSame(oldPos: Int, newPos: Int): Boolean { return dataList[oldPos] == newData[newPos] // 或逐一比较字段 } } val diffResult = DiffUtil.calculateDiff(diffCallback) dataList = newData diffResult.dispatchUpdatesTo(this) }
原理说明
之前的代码在onCreateView中每次创建新的Adapter,导致onResume中更新favouriteList后,旧Adapter持有的还是原来的列表引用,所以UI不会变化。将Adapter设为成员变量后,我们可以直接更新它的数据源并通知刷新,从而在onResume时让RecyclerView同步显示最新的收藏数据。
内容的提问来源于stack exchange,提问作者lunderhill
相关产品推荐
相关产品推荐

