Горизонтальный прокручиваемый ViewPager

Я хочу создать горизонтальный прокручиваемый ViewPager. Мой ViewPager содержит фрагменты. Ширина каждого фрагмента больше экрана, поэтому необходимо включить прокрутку.

Я использую следующий макет для своего элемента фрагмента:

<HorizontalScrollView
        android:id="@+id/view_horizontal_scroll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:isScrollContainer="true" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:orientation="horizontal" >

            <View
                android:layout_width="100dp"
                android:layout_height="fill_parent"
                android:background="#AABBCC" />

            <View
                android:id="@+id/test"
                android:layout_width="1500dp"
                android:layout_height="fill_parent" />

            <View
                android:layout_width="100dp"
                android:layout_height="fill_parent"
                android:background="#ccBBaa" />
        </LinearLayout>
    </HorizontalScrollView>

Я также создал собственный ViewPager, который позволяет выполнять горизонтальную прокрутку:

public class ScrollableViewPager extends ViewPager {

    private GestureDetector mGestureDetector;

    public ScrollableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(getContext(),
                new YScrollDetector());
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Tell our parent to stop intercepting our events!
        getParent().requestDisallowInterceptTouchEvent(true);

        return super.onInterceptTouchEvent(ev)
                && mGestureDetector.onTouchEvent(ev);
    }
}

YScrollDetector перезаписывает только метод onScrollMethod. Все идет нормально. Горизонтальная прокрутка работает нормально.

Но теперь у меня проблема:

Допустим, у меня есть ViewPager с 5 фрагментами ([0], [1], [2], [3], [4]) и я хочу начать с элемента [2]. Когда я прокручиваю назад, я хочу, чтобы позиция прокрутки предыдущего элемента [1] была на правом максимуме, а не на 0.

Мои Фрамгенты выглядят так:

public class AbstractFragment extends Fragment {

    private static final String _ID = "ID";
    private int _id;
    private ScrollableViewPager mPager;

    public AbstractFragment() {

    }

    public AbstractFragment(int id, int colorId) {
        this._id = id;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(getClass().getSimpleName(), "[" + _id + "]: onCreate");
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            _id = savedInstanceState.getInt(_ID);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View fragmentView = inflater.inflate(R.layout.fragment_menu_container,
                container, false);

        setUpScrollView(fragmentView);

        return fragmentView;
    }

    @Override
    public void onResume() {
        Log.d(getClass().getSimpleName(), "[" + _id + "]: onResume");
        setUpScrollView(getView());
        super.onResume();
    }

    private void setUpScrollView(View fragmentView) {
        if (fragmentView == null) {
            return;
        }
        HorizontalScrollView scrollView = (HorizontalScrollView) fragmentView
                .findViewById(R.id.view_horizontal_scroll);

        if (scrollView != null) {
            int currentItem = getCurrentPagerItem();
            if (_id < currentItem) {
                // previous Item : X Scroll: width of content
                View content = scrollView.getChildAt(0);
                int width = content.getRight();
                width = width - scrollView.getRight();
                scrollView.scrollTo(width, 0);
                Log.d(getClass().getSimpleName(), "[" + _id + "] width: "
                        + width);
                // scrollView.fullScroll(View.FOCUS_RIGHT);
            } else if (_id > currentItem) {
                // next Item - X Scroll: 0
                scrollView.fullScroll(View.FOCUS_LEFT);
            } else {
                // current Item - Nothing to do her
            }

        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (outState == null) {
            return;
        }

        outState.putInt(_ID, _id);
    }

    private ScrollableViewPager getPager() {
        PagerActivity activity = (PagerActivity) getActivity();
        return activity.getViewPager();
    }

    private int getCurrentPagerItem() {
        if (mPager == null) {
            mPager = getPager();
        }

        return mPager.getCurrentItem();
    }
}

В своих фрагментах я хочу установить положение прокрутки предыдущего фрагмента. Но это не работает, потому что ширина ScrollView и ContentView равна 0.

Кто-нибудь знает ответ? Спасибо!!!


person dudeldidadum    schedule 07.05.2012    source источник


Ответы (1)


Я нашел решение самостоятельно:

private void setUpScrollView(final ViewGroup fragmentView) {
        if (fragmentView == null) {
            return;
        }

        fragmentView.getViewTreeObserver().addOnGlobalLayoutListener(
                new OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        HorizontalScrollView scrollView = (HorizontalScrollView) fragmentView
                                .findViewById(R.id.view_horizontal_scroll);

                        if (scrollView != null) {
                            int currentItem = getCurrentPagerItem();
                            if (_id < currentItem) {
                                // previous Item
                                View content = scrollView.getChildAt(0);
                                int width = content.getWidth();
                                width = width - scrollView.getWidth();
                                scrollView.scrollTo(width, 0);
                            } else if (_id > currentItem) {
                                // next Item
                                scrollView.scrollTo(0, 0);
                            } else {
                                // current Item
                            }

                        }
                    }
                });

    }
person dudeldidadum    schedule 07.05.2012
comment
_id не объявлен, пожалуйста, скажите мне, что такое значения id; - person Kanaiya Katarmal; 27.08.2012