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的变化,再掉滑动。经测试有效。
我们知道,当调用
smoothScrollToPosition(0)方法,listView会快速的平滑的滑动到顶部。但是当listView加载的数据list太多的时候,这个方法就会失效,据网上的介绍,是因为这个方法会消耗太多的资源,所以不能完全处理完所有的items 回到顶部。于是就滑动到一个不确定的位置。那怎么解决这个问题呢,有两个方法可供选择:
方法一:使用setSelection(0
在项目中有应用到这个功能的需求,要求每次进入页面自动跳到对应的位置。但是在实际使用过程中.smoothScrollToPosition()有时好用有时不好用;
在setData();并且notifyDataSetChanged(); 之后调用,后来偶然发现可能是在设置的时候,数据并没有加载好,导致了时好时坏。
我的解决办法是延时0.5s再进行滚动操作,如下:
new Handler().postDelayed(new Runnable() {
当你在做聊天界面的时候, 通常进入界面后, 都需要显示到最底部, 鹅场也是这么干的;很容易就能找到 RecyclerView的smoothScrollToPosition 方法.而且也确实实现了目的;为什么不用 scrollToPosition 这个方法呢? 你去试试就知道!但是,,,这个方法会带来界面的滚动, 当聊天记录特别多的时候, 这个滚动时间会持续很长, 显然产品经理不爽了, 那么看完本文
class CenterLayoutManager extends LinearLayoutManager {
public CenterLayoutManager(Context context) {
super(context);
@Override
public void smoothScrol...
使用post方法:有时候,在调用scrollToPosition方法之前,RecyclerView还没有被完全刷新。在这种情况下,建议使用post方法将要滚动到的位置移动到UI线程队列的末尾。确保RecyclerView有足够的高度:如果RecyclerView没有足够的高度,它将无法滚动。因此,你需要确保RecyclerView有足够的高度,以便能够滚动。使用上述的方法,在大多数情况下可以解决RecyclerView中scrollToPosition无效的问题。