26

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

}

4

2 に答える 2

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

これがお役に立てば幸いです。お気軽にご相談ください。

于 2012-10-04T18:14:34.307 に答える