2013-04-11 34 views
6

Tôi đang phát triển một ứng dụng mà tôi phải sử dụng viewpager và sau khi tất cả các mục trong viewpager được hoàn thành, tôi phải gọi một hoạt động. Tôi không thể có được người nghe sự kiện cho việc này. Dưới đây là những gì tôi đã được đề cập quá: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.javaGọi hành động sau khi viewpager kết thúc

đây là những gì tôi đã làm cho đến nay:

public class MainActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    ImagePagerAdapter adapter = new ImagePagerAdapter(); 
    viewPager.setAdapter(adapter); 

    OnPageChangeListener mListener = new OnPageChangeListener() { 

     @Override 
     public void onPageSelected(int arg0) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 
      Log.i("Doing something here", "On Scroll state changed"); 
     } 
    }; 
    viewPager.setOnPageChangeListener(mListener); 

} 

private class ImagePagerAdapter extends PagerAdapter { 
    private int[] mImages = new int[] { R.drawable.libin1, 
      R.drawable.libin2 }; 

    @Override 
    public int getCount() { 
     return mImages.length; 

    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((ImageView) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Context context = MainActivity.this; 
     ImageView imageView = new ImageView(context); 
     int padding = context.getResources().getDimensionPixelSize(
       R.dimen.padding_medium); 
     imageView.setPadding(padding, padding, padding, padding); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     imageView.setImageResource(mImages[position]); 
     ((ViewPager) container).addView(imageView, 0); 
     return imageView; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     ((ViewPager) container).removeView((ImageView) object); 
    } 
} 
} 

Câu hỏi của tôi là làm thế nào để có được sự kiện người nghe nếu tất cả các mục trong ViewPager kết thúc.

Mọi loại trợ giúp sẽ được đánh giá cao.

+2

Xong !!! bạn có thể giải thích ? – Triode

+0

Tôi nghĩ rằng tôi đã giải thích tất cả trong câu hỏi. Không có gì để giải thích. Nghi ngờ của bạn là gì? Tôi đã yêu cầu rõ ràng nghi ngờ rằng làm thế nào tôi có thể nhận được sự kiện nghe hoặc là có bất kỳ cách nào khác để gọi một hoạt động nếu người dùng như cuộn đến mục cuối cùng trong viewpager. – Anupam

+1

"nếu người dùng được cuộn đến mục cuối cùng trong chế độ xem." Điều này làm cho anh em ý nghĩa hơn – Triode

Trả lời

17
private OnPageChangeListener mListener = new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int arg0) { 
     // TODO Auto-generated method stub 
     selectedIndex = arg0; 

    } 
    boolean callHappened; 
    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 
     // TODO Auto-generated method stub 
     if(mPageEnd && arg0 == selectedIndex && !callHappened) 
     { 
      Log.d(getClass().getName(), "Okay"); 
      mPageEnd = false;//To avoid multiple calls. 
      callHappened = true; 
     }else 
     { 
      mPageEnd = false; 
     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int arg0) { 
     // TODO Auto-generated method stub 
     if(selectedIndex == adapter.getCount() - 1) 
     { 
      mPageEnd = true; 
     } 
    } 
}; 
ViewPager.setOnPageChangeListener(mListener); 

onPageScrolled hoặc onPageSelected bất kỳ của các bạn có thể sử dụng ở đây và cũng có thể kiểm tra các trang đã chọn là tương đương với số lượng của các mục trong ViewPager.

+0

Thêm điều này trong mã của tôi. In các bản ghi trên 'onPageScrollStateChanged', nó được in trên mọi người dùng cuộn. Làm thế nào để đếm mảng của tôi. Vì vậy, sau khi chỉ mục mảng đạt đến kết thúc thì chỉ có sự kiện cháy. Tôi đã chỉnh sửa câu hỏi của mình bằng mã được cập nhật. Vui lòng xem và đề xuất tôi nên làm gì? – Anupam

+0

onPageScrolled bên trong chức năng này chỉ kiểm tra nếu chỉ mục được chọn của ViewPager giống như kích thước mảng của bạn hay không, sau đó kích hoạt sự kiện thr – Triode

+0

Xem câu trả lời đã chỉnh sửa – Triode

1

Cảm ơn Triode vì câu trả lời tuyệt vời.

Tôi đã sử dụng mã mà bạn đã đăng cho dự án của mình. Trong trường hợp của tôi, tôi hoàn thành hoạt động nếu người dùng vuốt sang phải trên đoạn cuối cùng. Nó hoạt động tốt, nhưng nó vẫn kết thúc hoạt động khi bạn vuốt sang trái thay vì vuốt sang phải.

Tôi đã thay đổi mã của bạn và đặt adapter.getCount() - 1 thay cho selectedIndex. Trong trường hợp này, nó sẽ không kết thúc hoạt động nếu người dùng vuốt sang trái.

if(mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){ 
    Log.d(getClass().getName(), "Okay"); 
    mPageEnd = false;//To avoid multiple calls. 
    callHappened = true; 
}else{ 
    mPageEnd = false; 
} 
0
@Override 
public void onPageScrolled(int pageScrolledOn, float positionOffset, int positionOffsetPixels) { 

      if(positionOffset == 0F){ 
       // meaning you cannot scroll further in current scroll direction 

       int lastPage = viewPagerAdapter.getCount - 1; 
       if (pageScrolledOn == lastPage){ 

        //scroll on last page has occured 
        scrolledOnLastPage = true; 
       } 
      } 

     } 
3

ba callbacks làm việc như thế này:

  • onPageScrollStateChanged được gọi với nhà nước ViewPager.SCROLL_STATE_DRAGGING
  • onPageScrolled sẽ được gọi nhiều lần, thông số positionOffset và positionOffsetPixels của nó đang tiếp tục tăng
  • vị trí thông số onPageScrolledBài đặt nhiều hơn 0,5, onPageScrollStateChanged được gọi với trạng thái SCROLL_STATE_SETT LING
  • onPageSelected được gọi với chỉ số trang tiếp theo như vị trí
  • onPageScrolled sẽ được gọi nhiều lần, thông số positionOffset và positionOffsetPixels của nó đang tiếp tục tăng
  • tham số onPageScrolled của positionOffset là 1, onPageScrollStateChanged được gọi với nhà nước SCROLL_STATE_IDLE

Logic không được đặt trong onPageSelected và onPageScrollStateChanged, vì với chúng bạn chỉ biết trạng thái được thay đổi. chỉ trong onPageScrolled bạn có thể nhận được hướng. Do đó, triển khai của tôi là như sau:

 private int selectedPageIndex = -1; 
     private boolean exitWhenScrollNextPage = false; 

     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) { 
       exitWhenScrollNextPage = false; // avoid call more times 
       AndroidLog.error("-------- YEAH!"); 
      } 
     } 

     @Override 
     public void onPageSelected(int position) { 
      selectedPageIndex = position; 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
      if (state == SCROLL_STATE_IDLE) { 
       exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1; 
      } 

     } 
+0

Làm cách nào để bạn nhận được Page_count – Praneeth

+0

'PAGE_COUNT' có thể là hằng số được xác định ở đầu lớp. Bạn có thể sử dụng số lượng mục thay thế. – sotrh

+0

@praneethkumar từ bộ điều hợp của máy nhắn tin xem như adapter.getCount(); – karvoynistas

0

Câu trả lời được đề xuất phức tạp hơn tôi nghĩ. Tôi đã tạo một câu trả lời đơn giản.

Tôi đã sử dụng OnPageChangeListener trong lớp ViewPager. Ở đây chúng ta có 3 phương pháp. void onPageScrolled (vị trí int, float positionOffset, int positionOffsetPixels) void onPageSelected (int position); void onPageScrollStateChanged (int state);

Điều quan trọng là phải biết các trạng thái trong onPageScrollStateChanged() và chuỗi thực thi của chúng. Có 3 trạng thái là SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING và SCROLL_STATE_SETTLING.

Đây là lệnh thực hiện. Scroll_state_dragging -> Scroll_state_settling -> onPageSelected() -> Scroll_state_idle

Ý tưởng đang giữ một lá cờ bên trong onPageSelected() để ghi lại số trang hiện tại. Sau đó, nếu người dùng ở trang cuối cùng và vuốt sang trái scroll_state_dragging được gọi và khởi chạy chế độ xem tiếp theo.

private int pagePosition; // keep a class variable 
private int[] layouts= new int[]{ 
    R.layout.welcome_slide1, 
    R.layout.welcome_slide2, 
    R.layout.welcome_slide3}; 

ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { 
@Override  
public void onPageSelected(int position) { 
    addBottomDots(position); 
    pagePosition = position; 
} 

@Override 
public void onPageScrolled(int position, float positionOffset, int arg2) { 
} 

@Override 
public void onPageScrollStateChanged(int state) { 
    if (state == ViewPager.SCROLL_STATE_DRAGGING) { 
     if (pagePosition == layouts.length - 1) { 
      launchHomeScreen(); 
     } 
    } 
} 
}; 

private void launchHomeScreen() { 
startActivity(new Intent(IntroductionActivity.this, MainDockerActivity.class)); 
finish(); 
} 

tôi đã tạo ra một ví dụ hoàn chỉnh here.

Các vấn đề liên quan