Подтвердить что ты не робот

Android ViewPager onPageScrollStateChanged никогда не вызывается

Я расширил класс ViewPager и реализовал onPageChangeListener. Я использую этот ViewPager в сочетании с CirclePageIndicator внутри SherlockFragment. ViewPager содержит ImageViews и TextViews, ничего необычного.

Мне нужно делать что-то под ViewPager каждый раз, когда страница изменяется. Итак, я решил, что мне нужно использовать onPageScrollStateChanged и проверить, когда состояние IDLE или что-то.

Проблема заключается в том, что из 3 реализованных методов (onPageScrollStateChanged, onPageSelected и onPageScrolled) вызывается только onPageScrolled (я проверял сообщение журнала в каждом методе). Почему это? Код ниже.

public class UninterceptableViewPager extends ViewPager implements OnPageChangeListener{

private ArrayList<TwoRowListViewAdapter> mAdaptersList = null;
private ListView mListView = null;
private ProgressBar mProgressBar = null;


public UninterceptableViewPager(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

public boolean onInterceptTouchEvent(MotionEvent event)
{
    getParent().requestDisallowInterceptTouchEvent(true);
    return super.onInterceptTouchEvent(event);
}


public void setAdaptersList(ArrayList<TwoRowListViewAdapter> adaptersList)
{
    mAdaptersList = adaptersList;
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
    super.onPageScrolled(position++, positionOffset, positionOffsetPixels);
    if (positionOffset == 0) // FIXME
        loadHistoryPage(position);
}

@Override
public void onPageSelected(int position) {}

@Override
public void onPageScrollStateChanged(int state) {}


// -------------------------------------------------------------------------------------------
// --------------   Helper Methods
// -------------------------------------------------------------------------------------------


public void setListView(ListView listview)
{
    mListView = listview;
}

public void setProgressBar(ProgressBar progressBar)
{
    mProgressBar = progressBar;
}

private void loadHistoryPage(int position)
{
    mListView.setVisibility(View.INVISIBLE);
    mProgressBar.setVisibility(View.VISIBLE);
    mListView.setAdapter(null);
    mListView.setAdapter(mAdaptersList.get(position-1));
    mProgressBar.setVisibility(View.INVISIBLE);
    mListView.setVisibility(View.VISIBLE);
}

}

4b9b3361

Ответ 1

Когда вы используете PageIndicator в сочетании с Viewpager, тогда onPageChangeListener из ViewPager не вызывается. Я не знаю причину этого, но это произошло, когда я использовал оба. Может быть причиной того, что индикатор страницы потребляет событие изменения страницы. Вместо этого вы должны установить прослушиватель смены страницы в PageIndicator, и он будет вызываться, когда страница изменится. Вот как вы можете это сделать:

indicator.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected (int page)
        {
            //page changed
        }

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

        @Override
        public void onPageScrollStateChanged (int arg0)
        {
        }
    });

Надеюсь, это поможет. Не стесняйтесь обсуждать.

Ответ 2

setOnPageChangeListener устарел. используйте addOnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });