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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:15:05