Android Kotlin RecyclerView重新请求数据后item高度持续增加问题
问题根因
你每次接口请求返回数据后都会重复执行以下操作,导致ItemDecoration被多次添加,item的高度随装饰器的叠加不断升高:
- 每次数据回调都重新创建Adapter实例
- 每次都给RecyclerView重复调用
addItemDecoration,添加的Header和分割线装饰器会持续累加item的上下偏移量 - 每次都重新给RecyclerView设置Adapter
修复方案
将Adapter初始化、RecyclerView配置、装饰器添加的逻辑移到onCreate中仅执行一次,数据更新时仅更新Adapter内的数据集即可。
修改后的FirstActivity.kt代码示例
class FirstActivity : BaseActivity() { lateinit var binding: FirstLayoutActivityLayoutBinding private val viewModel: FirstViewModel by inject() private var listAdapter: ListAdapter? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = FirstLayoutActivityLayoutBinding.inflate(layoutInflater) setContentView(binding.root) // 初始化操作仅执行一次 initRecyclerView() setupViewModel() } private fun initRecyclerView() { // 初始化Adapter listAdapter = ListAdapter(mutableListOf()) binding.recyclerView.apply { // 装饰器仅添加一次 addItemDecoration(HeaderItemDecoration(context)) val itemDecorator = DividerItemDecoration(context, DividerItemDecoration.VERTICAL) itemDecorator.setDrawable(ContextCompat.getDrawable(context, R.drawable.divider)!!) addItemDecoration(itemDecorator) // Adapter仅设置一次 adapter = listAdapter } } private fun setupViewModel() { viewModel.livedata.observe(this, { list -> // 数据更新时仅更新Adapter数据集即可 listAdapter?.updateItemsList(list) }) } override fun onResume() { super.onResume() viewModel.fetchItem() // 普通retrofit请求 } }
同时建议给Adapter的updateItemsList方法中添加数据集更新后调用notifyDataSetChanged()或者用DiffUtil做差分更新,避免全局刷新的性能问题。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

