Intereting Posts
Возможно ли создать ссылку «share on Facebook», которая откроет собственное приложение Facebook на Android / iOS / mobile вместо диалога веб-ресурса? Найти окно, содержащее вид в Android Как сделать приложение «Android-unlocker» безопаснее против сухарей? Календарь Android: как написать адаптер синхронизации для календаря INSERT Когда мне нужно android.hardware.location.gps и android.hardware.location.network? Что такое android.R.layout.simple_list_item_1? Android SQLite Exception: невозможно закрыть из-за нефинализированных операторов Setvisibility (view.visible) не работает после setvisibility (view.gone) Android ImageView не соответствует_parent внутри FrameLayout ниже GingerBread Автоматизация для выпуска Android Объект AudioRecord не инициализируется Выполнение не выполнено для задачи ': app: transformClassesAndResourcesWithProguardForRelease Как решить инструменты Facebook: replace = "android: theme"? Скрытие панели инструментов с помощью прокрутки с помощью recyclerview внутри фрагмента Как интегрировать шлюз оплаты ccavenue в моем приложении Android

Прокрутите RecyclerView, чтобы отобразить выбранный элемент сверху.

Я ищу способ прокрутки RecyclerView чтобы показать выбранный элемент сверху.

В ListView я смог сделать это с помощью scrollTo(x,y) и получить вершину элемента, который должен быть центрирован.

Что-то вроде:

 @Override public void onItemClick(View v, int pos){ mylistView.scrollTo(0, v.getTop()); } 

Проблема в том, что RecyclerView возвращает ошибку при использовании метода scrollTo говорящего

RecyclerView не поддерживает прокрутку до абсолютного положения

Как прокрутить RecyclerView чтобы поместить выбранный элемент в верхнюю часть представления?

Solutions Collecting From Web of "Прокрутите RecyclerView, чтобы отобразить выбранный элемент сверху."

Если вы используете LinearLayoutManager или StaggeredGridLayoutManager, у каждого из них есть метод scrollToPositionWithOffset, который занимает как позицию, так и смещение начала элемента с начала RecyclerView, что похоже на то, что оно выполнит то, что вам нужно (установка смещения To 0 должен совпадать с верхним).

Например:

 //Scroll item 2 to 20 pixels from the top linearLayoutManager.scrollToPositionWithOffset(2, 20); 

Если вы ищете вертикальный LinearLayout Manager, вы можете добиться плавной прокрутки с помощью пользовательского LinearSmoothScroller :

 import android.content.Context; import android.graphics.PointF; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearSmoothScroller; import android.support.v7.widget.RecyclerView; public class SnappingLinearLayoutManager extends LinearLayoutManager { public SnappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()); smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } private class TopSnappedSmoothScroller extends LinearSmoothScroller { public TopSnappedSmoothScroller(Context context) { super(context); } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return SnappingLinearLayoutManager.this .computeScrollVectorForPosition(targetPosition); } @Override protected int getVerticalSnapPreference() { return SNAP_TO_START; } } } 

Используйте экземпляр layoutmanager в режиме просмотра, а затем вызовите recyclerView.smoothScrollToPosition(pos); Сгладит прокрутку до выбранной позиции до верхней части просмотра ресайклера

// Элемент прокрутки pos

 linearLayoutManager.scrollToPositionWithOffset(pos, 0); 

Вам просто нужно вызвать recyclerview.scrollToPosition(position) . Хорошо!

Если вы хотите вызвать его в адаптере, просто пусть ваш адаптер имеет экземпляр recyclerview или активность или фрагмент, который содержит recyclerview, чем реализует в них метод getRecyclerview() .

Надеюсь, это может вам помочь.

С регулятором скорости

 public class SmoothScrollLinearLayoutManager extends LinearLayoutManager { private static final float MILLISECONDS_PER_INCH = 110f; private Context mContext; public SmoothScrollLinearLayoutManager(Context context,int orientation, boolean reverseLayout) { super(context,orientation,reverseLayout); mContext = context; } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext()){ //This controls the direction in which smoothScroll looks for your view @Override public PointF computeScrollVectorForPosition(int targetPosition) { return new PointF(0, 1); } //This returns the milliseconds it takes to scroll one pixel. @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { return MILLISECONDS_PER_INCH / displayMetrics.densityDpi; } }; smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } private class TopSnappedSmoothScroller extends LinearSmoothScroller { public TopSnappedSmoothScroller(Context context) { super(context); } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return SmoothScrollLinearLayoutManager.this .computeScrollVectorForPosition(targetPosition); } @Override protected int getVerticalSnapPreference() { return SNAP_TO_START; } } } 

Попытайтесь, что сработало для меня круто!

Создать переменную private static int displayedposition = 0;

Теперь для позиции вашего RecyclerView в вашей деятельности.

 myRecyclerView.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) myRecyclerView.getLayoutManager(); displayedposition = llm.findFirstVisibleItemPosition(); } }); 

Поместите это заявление, где вы хотите, чтобы прежний сайт отображался в вашем представлении.

 LinearLayoutManager llm = (LinearLayoutManager) mRecyclerView.getLayoutManager(); llm.scrollToPositionWithOffset(displayedposition , youList.size()); 

Ну, вот и все, это отлично работает для меня \ o /

Что я сделал, чтобы восстановить положение прокрутки после обновления RecyclerView при нажатии кнопки:

 if (linearLayoutManager != null) { index = linearLayoutManager.findFirstVisibleItemPosition(); View v = linearLayoutManager.getChildAt(0); top = (v == null) ? 0 : (v.getTop() - linearLayoutManager.getPaddingTop()); Log.d("TAG", "visible position " + " " + index); } else{ index = 0; } linearLayoutManager = new LinearLayoutManager(getApplicationContext()); linearLayoutManager.scrollToPositionWithOffset(index, top); 

Получив смещение первого видимого элемента сверху до создания объекта linearLayoutManager, и после его создания вызывается scrollToPositionWithOffset объекта LinearLayoutManager.

Прокручивать в определенном положении
И это очень помогло мне. Через прослушиватель кликов вы можете получить позицию в своем адаптере

 layoutmanager.scrollToPosition(int position); 

Я использую следующий код, чтобы сгладить прокрутку элемента (thisView) до вершины.
Он также работает для GridLayoutManager с разной высотой:

 View firstView = mRecyclerView.getChildAt(0); int toY = firstView.getTop(); int firstPosition = mRecyclerView.getChildAdapterPosition(firstView); View thisView = mRecyclerView.getChildAt(thisPosition - firstPosition); int fromY = thisView.getTop(); mRecyclerView.smoothScrollBy(0, fromY - toY); 

Кажется, он работает достаточно хорошо для быстрого решения.

В моем случае у моего RecyclerView есть padding top, как это

 <android.support.v7.widget.RecyclerView ... android:paddingTop="100dp" android:clipToPadding="false" /> 

Затем, чтобы прокрутить элемент вверх, мне нужно

 recyclerViewLinearLayoutManager.scrollToPositionWithOffset(position, -yourRecyclerView.getPaddingTop());