安卓ViewPager的onPageScrollStateChanged不会被调用ViewPager、onPageScrollStateChanged

2023-09-04 12:24:38 作者:秂赱ヾ苶凉

我已经扩展了ViewPager类,并实现onPageChangeListener。 我用这个ViewPager结合内SherlockFragment一个CirclePageIndicator。该ViewPager包含ImageViews和TextViews,没有什么花哨。

I have extended the ViewPager class and implemented onPageChangeListener. I use this ViewPager in conjunction with a CirclePageIndicator inside a SherlockFragment. The ViewPager contains ImageViews and TextViews, nothing fancy.

我需要每次页面被更改的时间做下面的ViewPager东西。所以,我想我需要使用onPageScrollStateChanged并验证时,状态是空闲的,或者什么的。

I need to do something below the ViewPager every time the Page is being changed. So, I figured I need to use the onPageScrollStateChanged and verify when the state is IDLE, or something.

的问题是,从3实现的方法(onPageScrollStateChanged,onPageSelected和onPageScrolled),仅onPageScrolled被调用(我检查在每个方法的日志消息)。这是为什么 ?低于code。

The problem is that from the 3 implemented methods (onPageScrollStateChanged, onPageSelected and onPageScrolled), only onPageScrolled gets called (I checked with a log message in each method). Why is that ? Code below.

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);
}

}

推荐答案

当你与Viewpager那么ViewPager的onPageChangeListener不叫一起使用PageIndicator。我不知道这样做的原因,但是当我同时使用这件事。可能导致页面指示消耗的页面更改事件。相反,你应该设置一个网页变化监听到PageIndicator,它会被称为网页变化时。这里是你如何能做到这一点:

When you use PageIndicator in conjunction with the Viewpager then the onPageChangeListener of the ViewPager is not called. I don't know the reason for this but this happened when I was using both. May be cause the page indicator consumes the page change event. Instead you should set a page change listener to the PageIndicator and it will be called when the page changes. Here is how you can do this:

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

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

I hope this will help. Feel free to discuss.