ViewPager setCurrentItem Slide

У меня есть Activity ViewPager, первый фрагмент в этом ViewPager содержит ListView, и когда я нажимаю на любой элемент, он заменяет этот фрагмент выбранным, Я использую setCurrentItem(selectedItem,true)//for smooth scroll но ViewPager скользит по всем фрагментам перед выбранным фрагментом Я хочу, чтобы он скользил к выбранному фрагменту только не по всем фрагментам Я попытался использовать PageTransfrom.transformPage как это

@Override
public void transformPage(View page, float position) {
    int currentItem = viewPager.getCurrentItem();
    if (currentItem != selectedItem)
        page.setVisibility(View.GONE);
}

но не повезло

Ответ 1

Одним из возможных решений является изменение PagerAdapter, чтобы всегда возвращать нужную страницу на элемент № 2.

При нажатии на любой элемент с первой страницы сначала измените реализацию метода getItem(int position) PagerAdapter (это легко, если ваш PagerAdapter реализован в том же файле класса вашего кода), чтобы вернуть страницу вы хотите, когда position == 2, а затем вызовите setCurrentItem(2, true). Это может сделать гладкую прокрутку на выбранную страницу напрямую. Вам также может потребоваться изменить getCount(), чтобы ограничить счет только 2, иначе следующая страница может быть не ожидаемой.

Но этот метод отклоняет другие страницы. Пользователь может прокручивать назад только первую страницу, а затем перейти на другую страницу. Если вы хотите сохранить естественный порядок страниц с помощью ручного прокрутки (не щелчком), вы можете восстановить getItem(int position) в свою реализацию по умолчанию после остановки scoll (щелчком) и перезагрузить остановленную текущую страницу в естественный порядок, вызвав setCurrentItem(position, false) (немедленно, не гладко на этот раз), тогда пользователь может прокручивать назад и вперед вручную.

Ответ 2

Итак, если я правильно вас понимаю, вам нужен гладкий прокрутка к выбранному фрагменту, но только из предыдущего. Правильно?

Когда вы передаете true в setCurrentItem, он выполняет плавную прокрутку из текущей выбранной позиции. Это невозможно изменить. Поэтому решение вашей проблемы - выполнить двухэтапную настройку.

Сначала используйте setCurrentItem (selectedItem-1, false), чтобы установить его в предыдущий элемент. Как только этот переход завершен, вызовите setCurrentItem (selectedItem, true).

Я сам этого не сделал, но я предвижу несколько осложнений и особых случаев.

Если вы поместите один вызов setCurrentItem за другим, он, вероятно, не сработает. Возможно, вам нужно будет прослушать первое изменение страницы (используя OnPageChangeListener), чтобы выполнить второй вызов setCurrentItem.

Также есть за пределами, когда выбранный элемент является первым.

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

Ответ 3

ViewPager не подходит для того, чего вы пытаетесь достичь. Если вы используете ViewPager, добавьте Fragments в качестве страниц и прокрутите страницу от 0 до 3, он, безусловно, прокрутит страницу. Page 3 → Page 1 → Page 2 → Page 3 В целом, он будет идти на шаг время, когда один шаг соответствует переходу на следующую страницу.

То, что вы ищете, Восходящая Навигация.

В вашем случае вы можете сохранить все реализации фрагментов как есть. Просто разместите Fragment, содержащий ListView в действии, и когда пользователь выбирает элемент в нем, добавьте соответствующий Fragment с слайдом в процессе перехода.

Удачи.

Ответ 4

В целом, как уже сказано здесь, вы не должны использовать ViewPager, а также абсолютно для других целей.

Я думаю, что самый простой способ - просто переключиться на фрагмент, например:

yourListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                switch (position) {
                    case 0:
                        getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right)
                                .replace(R.id.content, MyFirstFragment.newInsance()).commit();
                        break;
                    case 1:
                        getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right)
                                .replace(R.id.content, MySecondFragment.newInsance()).commit();
                        /etc.
                }
            }
        });

Таким образом, у вас будет полный контроль над ним + возможность установки правильной анимации для каждого фрагмента.

Надеюсь, у вас есть моя идея.

Ответ 5

Я решил эту проблему, как это У меня есть один ViewPager (vp1) Содержит два фрагмента, один из которых содержит ListView элементов, во вторых фрагментах есть еще один ViewPager (vp2) Я перемещаю выбранный элемент без слайда по всем предыдущим элементам когда пользователь нажимает на Item on Listview

vp2.setCurrentItem(selectedItemIndex,false);
vp1.setCurrentItem(1,true);

сначала установите текущий элемент на второй просмотрщик без слайда, а затем сдвиньте первый просмотрщик и что он

Ответ 6

Вы должны сохранять видимый не только выбранный элемент, но и тот, который был выбран до этого, если вы хотите, чтобы анимация слайда была одна от другой. После вызова setCurrentItem(selectedItem,true) все вызовы viewPager.getCurrentItem() внутри transformPage возвращают то же самое значение, которое вы задали раньше, но не то, что оно изменяется с помощью плавного прокрутки. Я думаю, вы можете сделать это с помощью transformPage:

int prevSelFrag = 0, currentSelFrag = 0; //member variables

@Override
protected void onCreate(Bundle savedInstanceState) {
    pager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageSelected(int pos) {
            prevSelFrag = currentSelFrag;
            currentSelFrag = pos;
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    pager.setPageTransformer(false, new PageTransformer() {
        @Override
        public void transformPage(View page, float relativePosition) {
            float transDiff = prevSelFrag - currentSelFrag;
            if (transDiff > 1.0f || transDiff < -1.0f) {
                boolean transIsToRight = transDiff < 0.0f;
                if (transIsToRight && relativePosition < -1) {
                    page.setVisibility(View.GONE);
                } else if (relativePosition > 1) { //trans is to left
                    page.setVisibility(View.GONE);
                }else{
                    page.setVisibility(View.VISIBLE);
                }
            }else{
                page.setVisibility(View.VISIBLE);
            }
        }
    });
}

relativePosition - это позиция страницы относительно страницы, заданной на setCurrentItem, так что данный View page должен перейти в эту позицию в анимации (но не в реальном состоянии пейджера). Если, например, вы находитесь на странице 0 и вызываете setCurrentItem(2,true) в transformPage, вы можете получить:

  • текущий вид на стр. 1 с relativePosition = -2
  • текущий вид на странице 0 с relativePosition = -1
  • текущий вид на стр. 2 с relativePosition = 0

Конечно, эти значения изменяются между ними, чтобы сделать эффект перехода. ViewPager smoothScroll не работал у меня, пришлось использовать это решение, чтобы исправить это → fooobar.com/info/102602/...