【问题标题】:How to scroll recyclerView programmatically?如何以编程方式滚动 recyclerView?
【发布时间】:2018-02-19 09:10:06
【问题描述】:

我有一个水平的 recyclerView,当我第一次打开活动时,我想让 recyclerview 中的所有项目滚动到底部(在这种情况下是向右)并回到顶部(向左)。有点像动画。滚动行为应该对用户可见。

我试着这样做:

Animation slideRight = AnimationUtils.loadAnimation(this, R.anim.slide_right);
        Animation slideLeft = AnimationUtils.loadAnimation(this, R.anim.slide_left);
        slideRight.setDuration(1000);
        slideLeft.setDuration(1000);
        slideRight.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                recyclerView.startAnimation(slideLeft);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        recyclerView.startAnimation(slideRight);

动画左滑:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <translate
        android:duration="200"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />

</set>

动画向右滑动:

<translate
    android:duration="200"
    android:fromXDelta="100%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />

它可以工作,但是它只是将回收视图作为一个整体滑动,我只想滚动(滑动)这些项目。我该怎么做?

【问题讨论】:

  • 恒速?如果是这样,当你有数百个项目时,它将永远花费,如果不是(恒定时间),项目将显示几分之一秒......
  • 我只有10个项目,这个值不会改变
  • 所以使用smoothScrollToPosition()

标签: android android-layout android-recyclerview


【解决方案1】:

您可以使用scrollToPosition()

recyclerView.post(new Runnable() {
    @Override
    public void run() {
        recyclerView.scrollToPosition(adapter.getItemCount() - 1);
        // Here adapter.getItemCount()== child count
    }
});

smoothScrollToPosition()

recyclerView.post(new Runnable() {
    @Override
    public void run() {
        recyclerView.smoothScrollToPosition(adapter.getItemCount()- 1);
    }
});

要再次向上移动,您需要使用索引 0 调用上述方法。但首先,您需要确保 RecyclerView 滚动到最后。 所以,在RecyclerView 上加上ScrollListener 以确保最后一项可见。

【讨论】:

  • 我认为 OP 想要一个展示卷轴,有点像滚动到最后再返回。
  • 是的,我想是的。感谢清算。我一开始就错了。
  • @Abbas 正是我的意思
  • recyclerView.postDelayed(() -&gt; recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1), 1000); recyclerView.postDelayed(() -&gt; recyclerView.smoothScrollToPosition(0),500); 是一个选项,但它会快速滚动
  • 顺便说一句,如果你使用scrollListener,用户无法滚动到底部,每次他们这样做都会回到顶部
【解决方案2】:

使用这个..

 int top = 0;
 recyclerView.smoothScrollToPosition(top); // for top

 int bottom = recyclerView.getAdapter().getItemCount()-1;
 recyclerView.smoothScrollToPosition(bottom);

【讨论】:

    【解决方案3】:

    如果您需要将 recyclerview 的项目滚动到屏幕的中心,例如。展开您的项目 - 使用这种方式:

    在 app/build.gradle - 插入:

     implementation 'com.andkulikov:transitionseverywhere:1.7.4'
    

    当hadle点击适配器的onBindViewHolder时-插入:

    AutoTransition transitionPort = new AutoTransition();
                    transitionPort.setDuration(100);
                    transitionPort.addListener(new Transition.TransitionListener() {
                        @Override
                        public void onTransitionStart(@NonNull Transition transition) {
                            recyclerView.setEnabled(false);
                            recyclerView.setClickable(false);
                        }
    
                        @Override
                        public void onTransitionEnd(@NonNull Transition transition) {
                            recyclerView.post(() -> recyclerView.smoothScrollToPosition(position));
                            recyclerView.setEnabled(true);
                            recyclerView.setClickable(true);
                        }
    
                        @Override
                        public void onTransitionCancel(@NonNull Transition transition) {
                            recyclerView.setEnabled(true);
                            recyclerView.setClickable(true);
                        }
    
                        @Override
                        public void onTransitionPause(@NonNull Transition transition) {
    
                        }
    
                        @Override
                        public void onTransitionResume(@NonNull Transition transition) {
    
                        }
                    });
                    TransitionManager.beginDelayedTransition(recyclerView, transitionPort);
    

    【讨论】:

      【解决方案4】:

      尝试了其他方法后还是不行?

      这段出色的代码对我有用

      private void scrollToBottom(final RecyclerView recyclerView) {
          // scroll to last item to get the view of last item
          final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
          final RecyclerView.Adapter adapter = recyclerView.getAdapter();
          final int lastItemPosition = adapter.getItemCount() - 1;
      
          layoutManager.scrollToPositionWithOffset(lastItemPosition, 0);
          recyclerView.post(new Runnable() {
              @Override
              public void run() {
                  // then scroll to specific offset
                  View target = layoutManager.findViewByPosition(lastItemPosition);
                  if (target != null) {
                      int offset = recyclerView.getMeasuredHeight() - target.getMeasuredHeight();
                      layoutManager.scrollToPositionWithOffset(lastItemPosition, offset);
                  }
              }
          });
      }
      

      如果你想跳到其他列表项而不是最后一个,你可以修改行

      final int lastItemPosition = adapter.getItemCount() - 1;

      Source

      【讨论】:

        猜你喜欢
        • 2015-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 2017-04-13
        • 1970-01-01
        • 2011-01-15
        • 2015-10-05
        相关资源
        最近更新 更多