返回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:
- 创建对应的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") ) }
- 在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
相关产品推荐
相关产品推荐

