```
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的变化,再掉滑动。经测试有效。