Отображение нескольких страниц в ViewPager, неправильная позиция

Я пытаюсь реализовать PagerContainer Дейва Смита, чтобы показать несколько страниц в моем ViewPager. Я включил прослушиватель по нажатию для отображения номеров страниц, но когда я щелкаю по левой странице, появляется сообщение «нажал на элемент 2» (пункт 0 будет правильным). Если я нажимаю на среднюю и правую страницы, отображаются правильные сообщения: «элемент 1» и «элемент 2» соответственно. Я также приложил изображение, чтобы описать проблему. Как я могу это исправить? Заранее спасибо.

Фрагмент кода приведен ниже:

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        TextView view = new TextView(PagerActivity.this);
        view.setText("Item "+position);
        view.setGravity(Gravity.CENTER);
        view.setBackgroundColor(Color.argb(255, position * 50, position * 10, position * 50));


        view.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Toast.makeText(PagerActivity.this, "clicked on Item " + String.valueOf(position), 1000).show();

            }
        });

        container.addView(view);
        return view;
    }
    pager.setOffscreenPageLimit(adapter.getCount());

    pager.setPageMargin(15);

    pager.setClipChildren(false);
 burakk26 окт. 2012 г., 17:34
@Lemberg, к сожалению, это не помогло.
 Lemberg26 окт. 2012 г., 14:50
Попробуйте заменить тост на Toast.makeText (PagerActivity.this, «щелкнул по элементу» + (представление (TextView)) .getText (), 1000) .show ();
 koti06 февр. 2013 г., 11:54
Вы нашли решение для этого

Ответы на вопрос(2)

Измените это в файле PagerContainer.java. Я думаю, что это поможет:

@Override
public boolean onTouchEvent(MotionEvent ev) {
    // We capture any touches not already handled by the ViewPager
    // to implement scrolling from a touch outside the pager bounds.
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        mInitialTouch.x = (int) ev.getX();
        mInitialTouch.y = (int) ev.getY();
    default:
        if (mInitialTouch.x < mCenter.x) {
            ev.offsetLocation(-(mCenter.x - mInitialTouch.x), mCenter.y - mInitialTouch.y);
        } else {
            ev.offsetLocation(mCenter.x - mInitialTouch.x, mCenter.y - mInitialTouch.y);
        }
        break;
    }

    return mPager.dispatchTouchEvent(ev);
}
 Blackbelt12 янв. 2015 г., 12:16
что произойдет, если в альбомной ориентации у вас будет видно более трех страниц?
 Samik Bandyopadhyay23 сент. 2014 г., 03:21
ЭТО РАБОТАЕТ ... СПАСИБО
 zihao rong11 июл. 2017 г., 11:10
что такоеmCenter а такжеmInitialTouch ?

обработкой касаний и аппаратным ускорением. Скорее решение состоит в том, чтобы указать отрицательное поле для ViewPager:

ViewPager.setPageMargin(
    getResources().getDimensionPixelOffset(R.dimen.viewpager_margin));

Затем я указал это измерение в моемdimens.xml:

<dimen name="viewpager_margin">-64dp</dimen>

Чтобы компенсировать перекрывающиеся страницы, представление содержимого каждой страницы имеет противоположное поле:

android:layout_marginLeft="@dimen/viewpager_margin_fix"
android:layout_marginRight="@dimen/viewpager_margin_fix"

Опять вdimens.xml:

<dimen name="viewpager_margin_fix">32dp</dimen>

(Обратите внимание, чтоviewpager_margin_fix размерность вдвое меньше абсолютнойviewpager_margin измерение.)

Мы реализовали этов приложении голландской газетыDe Telegraaf Krant:

Ваш ответ на вопрос