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

返回HomeFragment时RecyclerView条目重复翻倍的问题求助

RecyclerView条目重复/翻倍问题解决

问题现象

每次从Support Fragment返回HomeFragment时,RecyclerView中的条目都会翻倍;Fragment间切换时,HomeFragment内的RecyclerView条目会重复增加。重启应用后恢复正常,但再次切换Fragment返回时问题复现。

问题原因

你的arrCategory是HomeFragment的成员变量,每次Fragment的onViewCreated生命周期方法执行时,都会往这个列表里重复添加8条分类数据。而Fragment切换时(比如使用add()+hide()的方式管理Fragment),Fragment实例不会被销毁,只是视图销毁重建,所以每次回到HomeFragment,onViewCreated都会再次执行,导致数据不断累加,最终条目翻倍/重复。

解决方案

有几种简单的修复方式,选一种适合你的即可:

方案1:添加数据前清空列表

在onViewCreated中添加数据前,先清空arrCategory,避免重复添加:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerCategory)

    // 先清空列表,再添加新数据
    arrCategory.clear()
    arrCategory.add(CategoryModel(R.drawable.electrician,"Electrician"))
    arrCategory.add(CategoryModel(R.drawable.plumber,"Plumber"))
    arrCategory.add(CategoryModel(R.drawable.acservice,"AC Service"))
    arrCategory.add(CategoryModel(R.drawable.carpentry,"Carpentry"))
    arrCategory.add(CategoryModel(R.drawable.drop,"Pick up & Drop"))
    arrCategory.add(CategoryModel(R.drawable.painting,"Painting"))
    arrCategory.add(CategoryModel(R.drawable.waterfilter,"Water Filter Repair"))
    arrCategory.add(CategoryModel(R.drawable.packer,"Pack and Move"))

    recyclerView.layoutManager = GridLayoutManager(context,3)
    val recyclerAdapter = context?.let { RecycleCategoryAdapter(it,arrCategory) }
    recyclerView.adapter = recyclerAdapter
}

方案2:将数据初始化移到只执行一次的生命周期方法

把数据初始化放到onCreate方法中,因为onCreate在Fragment生命周期中只会执行一次:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
    // 在这里初始化数据,只执行一次
    arrCategory.add(CategoryModel(R.drawable.electrician,"Electrician"))
    arrCategory.add(CategoryModel(R.drawable.plumber,"Plumber"))
    arrCategory.add(CategoryModel(R.drawable.acservice,"AC Service"))
    arrCategory.add(CategoryModel(R.drawable.carpentry,"Carpentry"))
    arrCategory.add(CategoryModel(R.drawable.drop,"Pick up & Drop"))
    arrCategory.add(CategoryModel(R.drawable.painting,"Painting"))
    arrCategory.add(CategoryModel(R.drawable.waterfilter,"Water Filter Repair"))
    arrCategory.add(CategoryModel(R.drawable.packer,"Pack and Move"))
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerCategory)

    recyclerView.layoutManager = GridLayoutManager(context,3)
    val recyclerAdapter = context?.let { RecycleCategoryAdapter(it,arrCategory) }
    recyclerView.adapter = recyclerAdapter
}

方案3:使用ViewModel管理数据(推荐,更符合架构规范)

如果后续数据会有变化,或者需要在配置变更(比如旋转屏幕)时保留数据,建议使用ViewModel:

  1. 创建对应的ViewModel类:
import androidx.lifecycle.ViewModel

class HomeViewModel : ViewModel() {
    val arrCategory = arrayListOf(
        CategoryModel(R.drawable.electrician,"Electrician"),
        CategoryModel(R.drawable.plumber,"Plumber"),
        CategoryModel(R.drawable.acservice,"AC Service"),
        CategoryModel(R.drawable.carpentry,"Carpentry"),
        CategoryModel(R.drawable.drop,"Pick up & Drop"),
        CategoryModel(R.drawable.painting,"Painting"),
        CategoryModel(R.drawable.waterfilter,"Water Filter Repair"),
        CategoryModel(R.drawable.packer,"Pack and Move")
    )
}
  1. 在HomeFragment中获取ViewModel并使用:
import androidx.lifecycle.ViewModelProvider

class HomeFragment : Fragment() {
    // ... 其他代码
    private lateinit var viewModel: HomeViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        viewModel = ViewModelProvider(this)[HomeViewModel::class.java]
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerCategory)

        recyclerView.layoutManager = GridLayoutManager(context,3)
        val recyclerAdapter = context?.let { RecycleCategoryAdapter(it, viewModel.arrCategory) }
        recyclerView.adapter = recyclerAdapter
    }
}

问题截图

正常状态:
正常状态

条目翻倍状态:
条目翻倍状态


内容的提问来源于stack exchange,提问作者Parish Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:50:23