Проведите по одному элементу за раз Recyclerview

Я попытался добавить прослушиватель прокрутки для просмотра переработчика и сделал некоторую логику, но я не могу прокручивать один элемент за раз. Я немного поискал в Интернете, но у меня есть сторонняя библиотека, которая имеет настраиваемый вид ресайклера. Можем ли мы реализовать прокрутку одного элемента за раз в режиме просмотра ресайклера? Если да подскажите как? Пролистывайте по одному элементу, как на этом изображении.


person Akshay Bhat 'AB'    schedule 01.09.2015    source источник
comment
Viewpager — это то, что вам нужно. Что касается пользовательских переходов, выполните это   -  person Udit Mukherjee    schedule 01.09.2015
comment
Спасибо. Но я не могу использовать ViewPager для прокрутки одного элемента в Recyclerview.   -  person    schedule 01.09.2015
comment
Гм, я имел в виду использование Viewpager вместо RecyclerView.   -  person Udit Mukherjee    schedule 01.09.2015
comment
Есть ли другой способ без использования Viewpager?   -  person    schedule 01.09.2015
comment
Дублирующий вопрос. Перейдите по этой ссылке.   -  person Kshitij Jain    schedule 11.02.2017
comment
привет @AkshayBhat'AB' не могли бы вы помочь мне с этим горизонтальная прокрутка влево"> stackoverflow.com/questions/49952965/   -  person    schedule 18.05.2018


Ответы (3)


Уже поздно, я знаю.

Существует очень простой способ получить требуемое поведение прокрутки с помощью пользовательского SnapHelper.

Создайте свой собственный SnapHelper, перезаписав стандартный (android.support.v7.widget.LinearSnapHelper).

public class SnapHelperOneByOne extends LinearSnapHelper{

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY){

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if( currentView == null ){
            return RecyclerView.NO_POSITION;
        }

        final int currentPosition = layoutManager.getPosition(currentView);

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

Это в основном стандартный метод, но без добавления счетчика прыжков, который рассчитывается по скорости прокрутки.

Если вы проводите быстро и долго, следующее (или предыдущее) представление будет центрировано (показано).

Если вы проведете пальцем медленно и коротко, текущий центрированный вид останется в центре после отпускания.

Я надеюсь, что этот ответ все еще может помочь кому-нибудь.

person Palm    schedule 30.10.2017
comment
Благодарю вас! твой ответ спас мой день - person Hoby; 30.12.2017
comment
Есть ли способ увеличить скорость Swipe. Он прокручивается, но для прокрутки к следующему элементу потребуется полное пролистывание. - person Dheeraj Rijhwani; 03.05.2018
comment
Вы нашли способ увеличить скорость салфетки? - person Rahul Khurana; 23.08.2018
comment
@DheerajRijhwani ты нашел решение? - person user924; 08.01.2020
comment
это не очень хорошо, ведь нужно еще до конца пролистать - person user924; 08.01.2020
comment
не плавная прокрутка - person Amar Singh; 07.05.2020
comment
Используйте новый PagerSnapHelper() вместо LinearShapHelper() - person Bilal Kazi; 07.05.2020
comment
понравился твой ответ, приятель, спасибо, спас мой день, братан - person shivam chawla; 01.09.2020

Это смягчает движение между элементами:

public class SnapHelperOneByOne extends LinearSnapHelper {

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if (currentView == null) {
            return RecyclerView.NO_POSITION;
        }

        LinearLayoutManager myLayoutManager = (LinearLayoutManager) layoutManager;

        int position1 = myLayoutManager.findFirstVisibleItemPosition();
        int position2 = myLayoutManager.findLastVisibleItemPosition();

        int currentPosition = layoutManager.getPosition(currentView);

        if (velocityX > 400) {
            currentPosition = position2;
        } else if (velocityX < 400) {
            currentPosition = position1;
        }

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

Пример:

LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
linearSnapHelper.attachToRecyclerView(recyclerView);
person Vladimir Escoto    schedule 18.03.2019
comment
ты гений бро, спасибо - person ParSa; 20.08.2019
comment
Почему существуют константы? 400 - person user924; 08.01.2020
comment
хорошо, но в случае вертикальной прокрутки скорость X заменяется скоростью Y, которая работает для меня. и mr user924 400 используется для проверки, тогда скорость прокрутки ниже или больше для проверки прокрутки вверх или прокрутки вниз - person Amar Singh; 07.05.2020
comment
Это действительно стоит. Ты спас мой день, братан. Спасибо - person G.N.SRIDHAR; 11.09.2020
comment
Если вы используете обратный макет в recyclerView, измените position2 на position1 в предложении if-else. теперь вы получите желаемый результат. - person Vijay; 21.01.2021
comment
Спасибо. Оно работает! - person apurv thakkar; 10.02.2021
comment
Спасибо, это идеально - person Skovie; 11.02.2021

https://github.com/googlesamples/android-HorizontalPaging/

Это ссылка на что-то похожее на то, что вы показали на изображениях. Дайте мне знать, если вы ищете что-то еще, и я свяжу соответствующие библиотеки.

В основном разница между ViewPager и recyclerView заключается в том, что в recyclerView вы переключаетесь между многими элементами, а в ViewPager вы переключаетесь между многими фрагментами или самими независимыми страницами.

Я вижу, вы используете этот https://github.com/lsjwzh/RecyclerViewPager. случае вы имеете в виду?

person Varun Agarwal    schedule 01.09.2015