【问题标题】:Scroll to top in RecyclerView with LinearLayoutManager使用 LinearLayoutManager 在 RecyclerView 中滚动到顶部
【发布时间】:2015-08-22 19:00:31
【问题描述】:

我有一个片段,其中有 RecyclerViewLinearLayoutManager,其中有 CardView 项目。单击项目应滚动到顶部有一个浮动操作按钮。我尝试使用scrollToPosition 以及scrollToPositionWithOffsetRecyclerView 以及LinearLayoutManager,如下所示。但它根本没有效果。为什么会这样?谁能帮帮我。

我已将RecyclerView 直接放在xml 文件中的SwipeRefreshView 内。只要将适配器设置为RecyclerView,我就会打电话给setFloatingActionButton

 public void setFloatingActionButton(final View view) {
    float = (android.support.design.widget.FloatingActionButton) getActivity().findViewById(R.id.float);
    float.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    mRecyclerView.smoothScrollToPosition(0);


            android.support.design.widget.Snackbar.make(view, "Scrolled to Top", android.support.design.widget.Snackbar.LENGTH_SHORT)
                    .setAction("Ok", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                            llm.scrollToPosition(0);

                        }
                    })
                    .setActionTextColor(getActivity().getResources().getColor(R.color.coloLink))
                    .show();
        }
    });
}

【问题讨论】:

  • 试试mLayoutManager.scrollToPositionWithOffset(0, 0);
  • 是的,我已经尝试过了。但这也没有效果,就像 scrollToPosition 一样。
  • 这很奇怪,因为我的布局也和你的差不多。我有一个带有布局管理器的RecyclerView,它被放置在SwipeRefreshview 中,这对我有用。
  • 如果我将适配器设置为 recyclerview 后立即调用 scrollToPosition 有什么问题吗?
  • 现在我放置了 mlayoutmanager.scrollToPositionWithOffset(0,0);在方法 setFloatingAction 按钮之外,它工作正常!!!

标签: android android-recyclerview


【解决方案1】:

从上面的 cmets 继续,理想情况下,替换

mRecyclerView.smoothScrollToPosition(0);

onClick的浮动操作按钮上用

mLayoutManager.scrollToPositionWithOffset(0, 0);

应该可以。您也可以删除SnackBar 代码,因为无论如何您都不需要它。所以,总而言之,你上面的方法应该看起来像

public void setFloatingActionButton(final View view) {
    float actionButton = (android.support.design.widget.FloatingActionButton) getActivity()
            .findViewById(R.id.float);
    actionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView
                    .getLayoutManager();
            layoutManager.scrollToPositionWithOffset(0, 0);
        }
    });
}

如果您说上述方法不起作用,请测试 onClick() 是否被调用。尝试在其中添加一条日志消息,看看是否打印出来。

【讨论】:

  • 是的,我实际上是通过从其他片段中删除对该方法的调用来获得它的。我直接将 fab 创建放在 onCreate() 方法中。它现在工作得很好。
  • 和小吃店它不起作用。没关系,因为不需要小吃店。
  • 此解决方案仅适用于第一个片段。如果我从两个片段中调用 setFloatingActionActionButton,则 scrollToTop 仅适用于第二个片段,但不适用于第一个片段。我正在从第一个片段扩展第二个片段。你能帮忙吗?
  • 你为什么首先在片段中调用它,而不是从活动中调用?
  • 如何在 mainactivity 中访问 mRecyclerView 并从 main Activity 设置 mRecyclerView.scrollToPosition(0)?我是android和java的新手。我在开发这个应用程序时学到了很多东西:)谢谢
【解决方案2】:

使用 smoothScrollToPosition() 的方法对我来说适用于最新的 Android 版本。

layoutManager.smoothScrollToPosition(mRecyclerView, null, 0);

【讨论】:

    【解决方案3】:

    使用这个调用'scrollToPosition(0)':

    public void scrollToPosition(final int position) {
        if (mRecyclerView != null) {
            getHandler().post(new Runnable() {
                @Override
                public void run() {
                    mRecyclerView.scrollToPosition(position);
                    if (position == 0) {
                        LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                        layoutManager.scrollToPositionWithOffset(0, 0);
                        mScrollView.fullScroll(View.FOCUS_UP);
                    }
                }
            });
        }
    }
    

    【讨论】:

    • 什么是 mScrollView..?
    • 私有 NestedScrollView mScrollView;
    【解决方案4】:

    在我的例子中,要求是以相反的顺序填充视图,这使得布局显示滚动视图的底部视图

    layoutManager.smoothScrollToPosition(mRecyclerView, null, 'last_index') 并没有真正帮助。

    当我制作回收站视图以在最后一个位置显示孩子时,我的问题得到了解决

    recyclerView.scrollToPosition(length-1)

    【讨论】:

      【解决方案5】:

      如果您不想平滑滚动,这将适用于任何LayoutManager

      myRecyclerView.getLayoutManager().scrollToPosition(0);
      

      【讨论】:

        【解决方案6】:

        在科特林中

                // Scroll to the top of the list
                GlobalScope.launch(Dispatchers.Main) {
                    delay(200)
                    if (binding.rateList.size > 1) {
                        //binding.recyclerView.smoothScrollToPosition(0)
                        binding.recyclerView.layoutManager?.scrollToPosition(0)
                    }
        

        【讨论】:

          【解决方案7】:

          上述解决方案对我不起作用,因为我的回收站视图位于 NestedScrollView 中。所以这个解决方案对我有用。

          nestedScroll.smoothScrollTo(0,recycler.top)
          

          【讨论】:

          • 在 NestedScrollView 中有一个 RecyclerView 是个坏主意。
          • Recyclerview 内 NestedScrollview 结果列表未回收但继续添加。应用程序肯定有滞后。最好单独使用 Recyclerview。
          猜你喜欢
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          相关资源
          最近更新 更多