2012-10-04 3 views
26

Tôi đã mở rộng lớp ViewPager và được triển khai trênPageChangeListener. Tôi sử dụng ViewPager này kết hợp với một CirclePageIndicator bên trong một SherlockFragment. ViewPager chứa ImageViews và TextViews, không có gì lạ mắt.OnPageScrollStateChanged của Android ViewPager không bao giờ được gọi là

Tôi cần phải làm điều gì đó bên dưới ViewPager mỗi lần Trang được thay đổi. Vì vậy, tôi figured tôi cần phải sử dụng onPageScrollStateChanged và xác minh khi nhà nước là IDLE, hoặc một cái gì đó.

Vấn đề là từ 3 phương pháp được triển khai (onPageScrollStateChanged, onPageSelected và onPageScrolled), chỉ onPageScrolled được gọi (tôi đã kiểm tra với thông điệp tường trình trong mỗi phương thức). Tại sao vậy ? Mã dưới đây.

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

}

Trả lời

68

Khi bạn sử dụng PageIndicator kết hợp với ViewPager thì onPageChangeListener của ViewPager không được gọi. Tôi không biết lý do cho điều này nhưng điều này xảy ra khi tôi đang sử dụng cả hai. Có thể gây ra chỉ báo trang tiêu thụ sự kiện thay đổi trang. Thay vào đó, bạn nên đặt trình xử lý thay đổi trang cho PageIndicator và nó sẽ được gọi khi trang thay đổi. Dưới đây là cách bạn có thể thực hiện việc này:

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

Tôi hy vọng điều này sẽ hữu ích. Hãy thảo luận.

+0

Vâng, tôi nghĩ giả định của bạn là chính xác. Vâng, tôi cần phải xác minh nó, nhưng nó có ý nghĩa. Cảm ơn bạn rất nhiều vì câu trả lời hoàn hảo này! Tôi sẽ kiểm tra giải pháp vào ngày mai và báo cáo những phát hiện của tôi. –

+0

ok Tôi sẽ chờ phản hồi của bạn .. – karn

+0

Tuyệt vời. Nó hoạt động hoàn hảo. Cảm ơn rất nhiều ! –

0

setOnPageChangeListener không được dùng nữa. sử dụng 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) { 

     } 
    });