永远不会调用Android ViewPager的onPageScrollStateChanged

时间:2012-10-04 14:22:08

标签: android android-viewpager

我扩展了ViewPager类并实现了onPageChangeListener。 我将此ViewPager与SherlockFragment中的CirclePageIndicator结合使用。 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);
}

}

2 个答案:

答案 0 :(得分:68)

当您将PageIndicator与Viewpager结合使用时,不会调用ViewPager的onPageChangeListener。我不知道原因,但这发生在我使用两者时。可能是因为页面指示器消耗了页面更改事件。相反,您应该将页面更改侦听器设置为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)
        {
        }
    });

我希望这会有所帮助。随意讨论。

答案 1 :(得分:0)

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) {

        }
    });