【问题标题】:How to scroll horizontal RecyclerView programmatically?如何以编程方式滚动水平 RecyclerView?
【发布时间】:2015-11-09 04:58:06
【问题描述】:

我有一个horizontal RecyclerView 和两个按钮(下一个,上一个),如下图所示。

所以我需要使用这些按钮移动到下一个项目或位置,我知道名为 scrollTo 的方法,但我不知道它是如何工作的

【问题讨论】:

    标签: android android-layout android-activity android-recyclerview


    【解决方案1】:

    我找到了答案:

    case R.id.next:
        mRecyclerView.getLayoutManager().scrollToPosition(linearLayoutManager.findLastVisibleItemPosition() + 1);
        break;
    case R.id.pre:
        mRecyclerView.getLayoutManager().scrollToPosition(linearLayoutManager.findFirstVisibleItemPosition() - 1);
        break;
    

    【讨论】:

    • 我认为,使用此代码会突然发生滚动。这不会提供平滑的滚动。
    • 第一次滚动时它向左移动两个位置:/
    • 如何一次滚动4个项目?
    【解决方案2】:

    RecyclerViews 有一个用于滚动到某个位置的方法:

    将滚动捕捉到给定位置:

    mRecyclerView.scrollToPosition(int position)
    

    平滑滚动到给定位置:

    mRecyclerView.smoothScrollToPosition(int position)
    

    要使这些方法起作用,RecyclerViewLayoutManager 需要实现这些方法,而LinearLayoutManager 确实以基本方式实现了这些,所以你应该很高兴。

    【讨论】:

    • 首先,如果您甚至不愿意先尝试,您希望有人如何帮助您,其次,如果有不清楚的地方,您可以要求详细说明。只需编写“请提供更多代码?!?”考虑到 some1 会花时间把你赶出去,几乎没有任何交换,这是相当粗鲁和苛刻的
    • @SoliTawako 我猜scrollTo(int x, int y) 你也可以滚动视图,但是以更精细的方式。
    • 如果我在 recyclerView 上应用,他们是否可以通过任何方式在布局管理器上应用“smoothScrollToPosition”以及 b/c,然后它不能连续工作(意味着在 1-2 滚动后停止),而使用 recyclerView 布局管理器它每次都能正常工作。 @AhmadAlkhateeb
    【解决方案3】:
    case R.id.next:
        mRecyclerView.getLayoutManager().scrollToPosition(linearLayoutManager.findLastVisibleItemPosition() + 1);
        break;
    
    case R.id.pre:
        mRecyclerView.getLayoutManager().scrollToPosition(linearLayoutManager.findFirstVisibleItemPosition() - 1);
        break;
    

    【讨论】:

      【解决方案4】:
      int mFirst=0, mLast=0;
      
      recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
          @Override
          public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
              super.onScrollStateChanged(recyclerView, newState);
          }
          @Override
          public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
              super.onScrolled(recyclerView, dx, dy);
              LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
              mLast = llm.findLastCompletelyVisibleItemPosition();
              mFirst = llm.findFirstCompletelyVisibleItemPosition();
          }
      });
      
      imgRight.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
              llm.scrollToPositionWithOffset(mLast + 1, List.length());
          }
      });
      
      imgLeft.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              LinearLayoutManager llm = (LinearLayoutManager) recyclerview.getLayoutManager();
              llm.scrollToPositionWithOffset(mFirst - 1, List.length());
          }
      });
      

      【讨论】:

      • 请解释你的答案
      【解决方案5】:

      除了已接受的答案之外,您还需要检查当前位置,以免出现如下所示的 nullPointerException

      binding.imageViewleft.setOnClickListener {
          if (layoutManager.findFirstCompletelyVisibleItemPosition()>0){
            binding.recyclerView.layoutManager?.scrollToPosition(layoutManager.findFirstCompletelyVisibleItemPosition()-1)
              }
          }
          binding.iv2.setOnClickListener {
                  if (layoutManager.findLastCompletelyVisibleItemPosition()<(sectiondata.size-1) ){
                      binding.recyclerView.layoutManager?.scrollToPosition(layoutManager.findLastCompletelyVisibleItemPosition()+1)
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多