Как можно создать горизонтальный список прокрутки с эффектом привязки к центру

OK! Я пытаюсь сделать это в течение последних нескольких недель и не могу найти подходящего решения, как я могу добиться того, чего хочу. Пробовал с HorizontalScrollView, Галерея (которая устарела).

Теперь я просматриваю RecycleView, потому что пришел к этому методу .smoothScrollToPosition() и подумал, что это может мне помочь.

Вот иллюстрация того, что я хочу выполнить:

enter image description here

Я также должен иметь возможность создавать relativelayouts программно

Может ли кто-нибудь указать мне, как это можно сделать? Есть ли какой-нибудь родной способ сделать это?

EDIT: посмотрев далее на @CommonsНаше предложение о просмотре в ViewPager и commonsware.com/blog/2012/08/20/третьем посте от Dave Smith. Думаю, это путь. Havent разрешил его использовать, но он выглядит хорошо.

Я использую образец Дэйва Смита из его Github: https://gist.github.com/devunwired/8cbe094bb7a783e37ad1

Ответ 1

Не используйте этот подход, он будет использовать много памяти (если в какой-то момент вам нужно будет перейти к более универсальному решению), потому что вам нужно будет сохранить повышенное число ViewPager Pages (Fragment) в памяти. У меня была такая же задача, и я сделал это с помощью HorizontalListView.

Итак, вам нужно создать Adapter, который добавит "заглушки" View, чтобы получить первую или последнюю (может быть больше в зависимости от желаемых видимых просмотров в одно и то же время), в центре экран, так как это ListView. Для эффекта привязки вы можете использовать что-то вроде этого (все предметы должны иметь равные размеры):

View.OnTouchListener hListViewsOnTouchListener = new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP && v instanceof HListView) {
                    View c = ((HListView) v).getChildAt(0);
                    int posToGo = Math.abs(c.getX()) < c.getWidth() / 2 ? ((HListView) v).getFirstVisiblePosition() : ((HListView) v).getFirstVisiblePosition() + 1;
                    ((HListView) v).smoothScrollToPositionFromLeft(posToGo, 0);
                }
                return false;
            }
        };

Этот подход использует не только меньше памяти, но и общий размер числа дочерних представлений, он более плавный, и все элементы являются кликабельными (а не только центрированными)... ну это ListView:)
Вот скриншот финального выходного примера:
enter image description hereenter image description hereenter image description here

Позаботьтесь.