添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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() { 当你在做聊天界面的时候, 通常进入界面后, 都需要显示到最底部, 鹅场也是这么干的;很容易就能找到 RecyclerViewsmoothScrollToPosition 方法.而且也确实实现了目的;为什么不用 scrollToPosition 这个方法呢? 你去试试就知道!但是,,,这个方法会带来界面的滚动, 当聊天记录特别多的时候, 这个滚动时间会持续很长, 显然产品经理不爽了, 那么看完本文 class CenterLayoutManager extends LinearLayoutManager { public CenterLayoutManager(Context context) { super(context); @Override public void smoothScrol... 使用post方法:有时候,在调用scrollToPosition方法之前,RecyclerView没有被完全刷新。在这种情况下,建议使用post方法将要滚动到的位置移动到UI线程队列的末尾。确保RecyclerView有足够的高度:如果RecyclerView没有足够的高度,它将无法滚动。因此,你需要确保RecyclerView有足够的高度,以便能够滚动。使用上述的方法,在大多数情况下可以解决RecyclerViewscrollToPosition无效的问题。