Android recyclerview прокручивает до положения [дубликат]

Вы также можете попробовать этот онлайн-инструмент для создания операторов SQL create / insert на основе вашего CSV. http://www.convertcsvtomysql.com/

Что мне нравится в этом инструменте:

  • Простой
  • Это не только генерирует инструкции INSERT, но и CREATE для генерации таблицы
  • . При создании операторов CREATE этот инструмент не просто делает все поля VARCHAR - он анализирует данные в вашем CSV и на основе этого анализа выбирает

    Недостатки

    • Размер входного файла ограничен 3mb
    • Возможно, вы не захотите отдать свой данные третьим лицам

59
задан Tiago 5 July 2015 в 21:30
поделиться

5 ответов

RecyclerView предназначен для расширения, поэтому нет необходимости подклассифицировать LayoutManager (поскольку droidev предложил ) просто для выполнения прокрутки.

Вместо этого, просто создайте SmoothScroller с предпочтением SNAP_TO_START:

RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(context) {
  @Override protected int getVerticalSnapPreference() {
    return LinearSmoothScroller.SNAP_TO_START;
  }
};

Теперь вы устанавливаете положение, в котором вы хотите прокрутить страницу:

smoothScroller.setTargetPosition(position);

и передать этот SmoothScroller в LayoutManager:

layoutManager.startSmoothScroll(smoothScroller);
82
ответ дан Shishram 21 August 2018 в 12:22
поделиться
  • 1
    Спасибо за это более короткое решение. Еще две вещи, которые я должен был рассмотреть в своей реализации: поскольку у меня есть горизонтальная прокрутка, мне пришлось установить protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }. Кроме того, мне пришлось реализовать абстрактный метод public PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }. – AustrianDude 11 July 2017 в 09:12
  • 2
    @AustrianDude computeScrollVectorForPosition не является абстрактным. Также он возвращает layoutManager.computeScrollVectorForPosition по умолчанию. – Paul Woitaschek 11 July 2017 в 12:24
  • 3
    RecyclerView может быть спроектирован так, чтобы быть расширяемым, но простая вещь, подобная этому, просто кажется ленивой, чтобы ее не хватало. Хороший ответ! Спасибо. – Michael 13 July 2017 в 02:45
  • 4
    Есть ли способ дать ему возможность начать, но со смещением X dp? – Mark Buikema 1 May 2018 в 12:03
  • 5
    @Alessio точно, это сломает функциональность smoothScrollToPosition по умолчанию для RecyclerView – droidev 12 July 2018 в 13:05

Самый простой способ, которым я нашел прокрутку RecyclerView, выглядит следующим образом:

// Define the Index we wish to scroll to.
final int lIndex = 0;
// Assign the RecyclerView's LayoutManager.
this.getRecyclerView().setLayoutManager(this.getLinearLayoutManager());
// Scroll the RecyclerView to the Index.
this.getLinearLayoutManager().smoothScrollToPosition(this.getRecyclerView(), new RecyclerView.State(), lIndex);
2
ответ дан Cawfree 21 August 2018 в 12:22
поделиться

для этого вам нужно создать собственный LayoutManager

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, VERTICAL, false);
    }

    public LinearLayoutManagerWithSmoothScroller(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 LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}

, использовать его для вашего RecyclerView и вызвать smoothScrollToPosition.

example:

 recyclerView.setLayoutManager(new LinearLayoutManagerWithSmoothScroller(context));
 recyclerView.smoothScrollToPosition(position);

это будет прокручиваться до элемента RecyclerView указанной позиции.

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

87
ответ дан droidev 21 August 2018 в 12:22
поделиться
  • 1
    Мне не удалось реализовать предложенный LayoutManager. Этот ответ здесь работал намного легче для меня: stackoverflow.com/questions/28025425/… – arberg 21 December 2015 в 08:24
  • 2
    Только полезный ответ после часовых болей, это работает так, как было разработано! – wblaschko 18 June 2016 в 00:06
  • 3
    SNAP_TO_START делают трюк! Tks! – DragonT 13 July 2016 в 20:55
  • 4
    @droidev Я использовал ваш пример с плавной прокруткой, и обычно SNAP_TO_START - это то, что мне нужно, но оно работает с некоторыми проблемами для меня. Иногда прокрутка останавливается на 1,2,3 или 4 позиции раньше, чем я перехожу к smoothScrollToPosition. Почему эта проблема может возникнуть? Благодарю. – Natasha 2 November 2016 в 14:23
  • 5
    Это правильный ответ, несмотря на принятый – Alessio 12 July 2018 в 06:04

Вероятно, подход @droidev является правильным, но я просто хочу опубликовать что-то немного другое, что делает в основном одно и то же задание и не требует расширения LayoutManager.

ПРИМЕЧАНИЕ здесь - это будет хорошо работать, если ваш элемент (тот, который вы хотите прокрутить вверху списка) виден на экране, и вы просто хотите автоматически прокручивать его вверх. Это полезно, когда последний элемент в вашем списке имеет какое-то действие, которое добавляет новые элементы в один список, и вы хотите сфокусировать пользователя на новых добавленных элементах:

int recyclerViewTop = recyclerView.getTop();
int positionTop = recyclerView.findViewHolderForAdapterPosition(positionToScroll) != null ? recyclerView.findViewHolderForAdapterPosition(positionToScroll).itemView.getTop() : 200;
final int calcOffset = positionTop - recyclerViewTop; 
//then the actual scroll is gonna happen with (x offset = 0) and (y offset = calcOffset)
recyclerView.scrollBy(0, offset);

Идея проста: 1. Нам нужно получить верхнюю координату элемента recyclerview; 2. Нам нужно получить верхнюю координату элемента вида, которую мы хотим прокрутить до вершины; 3. В конце с вычисленным смещением мы должны выполнить

recyclerView.scrollBy(0, offset);

200 - просто пример жесткого кодированного целочисленного значения, которое вы можете использовать, если элемент просмотра не существует, поскольку это возможно .

0
ответ дан Sniper 21 August 2018 в 12:22
поделиться

Мы можем попробовать это

    recyclerView.getLayoutManager().smoothScrollToPosition(recyclerView,new RecyclerView.State(), recyclerView.getAdapter().getItemCount());
0
ответ дан Supto 21 August 2018 в 12:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: