2012-10-04 4 views
26

私はViewPagerクラスを拡張し、onPageChangeListenerを実装しました。 このViewPagerは、SherlockFragment内のCirclePageIndicatorと組み合わせて使用​​します。 ViewPagerにはImageViewsとTextViewsが含まれています。Android ViewPagerのonPageScrollStateChangedは呼び出されません

ページが変更されるたびに、私は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); 
} 

}

答えて

68

あなたはViewpagerと一緒にPageIndicatorを使用すると、その後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) 
     { 
     } 
    }); 

私はこれが役立つことを願っています。自由に議論してください。

+0

はい、私はあなたの仮定が正しいと思います。まあ、私はそれを確認する必要がありますが、それは理にかなっています。この完璧な答えをありがとう!私は明日の解決策をテストし、私の発見を報告します。 –

+0

okフィードバックをお待ちしております。 – karn

+0

驚くばかりです。それは完全に動作します。どうもありがとう ! –

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

     } 
    }); 
関連する問題