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

如何在Fragment的onResume方法中实现页面数据刷新?

如何在Fragment的onResume中刷新收藏列表数据

你的问题核心是:favouriteList在其他Activity中更新后,当前Fragment的RecyclerView没有同步刷新——因为只有在onCreateView初始化Adapter时才会绑定初始数据,onResume中更新列表后没有通知Adapter数据变化。

解决方案步骤

  1. 将Adapter声明为Fragment的成员变量,避免每次onCreateView都创建新实例
  2. 在onResume中更新Adapter的数据源,并通知Adapter刷新UI
  3. (可选)使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:30:54