submitList()后smoothScrollToPosition()或scrollToPosition()无效的解决办法

```

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val adapter = WordAdapter()
    adapter.registerAdapterDataObserver(observer)
    binding.recyclerView.adapter = adapter
    viewModel.words.observe(viewLifecycleOwner, Observer {
        binding.hasData = it.isNotEmpty()
        adapter.submitList(it)
        binding.recyclerView.smoothScrollToPosition(0)
    })
    binding.refreshLayout.setOnPullListener(object : OnPullListener {
        override fun onRefresh() {
            viewModel.genearWord()
            binding.refreshLayout.finishRefresh()
        }
    })
}

```

本来以为这样调用会没有问题,谁知道调用smoothScrollToPosition()或scrollToPosition()并没有效果,stackoverflow上有人说用post(Runnable)的方法,测试发现是偶尔有用,偶尔没用。根本原因是submitList方法是在子线程执行的。所以不是根本办法。

```

private val observer = object: RecyclerView.AdapterDataObserver() {
    override fun onChanged() {
        binding.recyclerView.smoothScrollToPosition(0)
    }
    override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
        binding.recyclerView.smoothScrollToPosition(0)
    }
    override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {
        binding.recyclerView.smoothScrollToPosition(0)
    }
    override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
        binding.recyclerView.smoothScrollToPosition(0)
    }
    override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {
        binding.recyclerView.smoothScrollToPosition(0)
    }
    override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {
        binding.recyclerView.smoothScrollToPosition(0)
    }
}

```

这样监听adapter的变化,再掉滑动。经测试有效。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值