2013-04-11 43 views
6

我正在開發一個應用程序,我必須使用viewpager,並且在viewpager中的所有項目完成後,我必須調用一個活動。我無法爲此獲取事件監聽器。以下是我已經闖民宅太: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.javaviewpager完成後調用actvity

這是我迄今所做的:

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

我的問題是,如果在viewpager所有項目完成後如何讓事件偵聽器。

任何形式的幫助將不勝感激。

+2

完成!你可以解釋嗎 ? – Triode 2013-04-11 05:09:40

+0

我想我已經解釋了所有的問題。沒有什麼可以解釋的。你有什麼疑問?我清楚地問過,如何獲取事件監聽器或者是否有其他方式來調用活動,如果用戶滾動到viewpager中的最後一項。 – Anupam 2013-04-11 05:13:06

+1

「如果用戶滾動到viewpager中的最後一項。」這更有意義兄弟 – Triode 2013-04-11 05:22:41

回答

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

onPageScrolledonPageSelected任何這些,你可以在這裏使用,並檢查所選擇的頁面是等於在ViewPager項目的數量。

+0

在我的代碼中添加了這個。在'onPageScrollStateChanged'上打印日誌,它是在每個用戶滾動的打印。如何計算我的數組。所以,在數組索引達到其結束之後,只會觸發事件。我用更新後的代碼編輯了我的問題。請參閱並建議我應該怎麼做? – Anupam 2013-04-11 06:22:00

+0

onPageScrolled這個函數裏面只是檢查ViewPager的選定索引是否與你的數組大小相同,然後觸發事件 – Triode 2013-04-11 07:20:01

+0

查看編輯答案 – Triode 2013-04-11 07:42:57

1

非常感謝三極管。

我使用了您爲我的項目發佈的代碼。就我而言,如果用戶在最後一個片段上向右滑動,我正在完成該活動。它運行良好,但當您向左滑動而不是向右滑動時,它仍然完成活動。

我對您的代碼進行了更改,並將adapter.getCount() - 1代替爲selectedIndex。在這種情況下,如果用戶向左滑動,它將不會完成活動。

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

這三個回調的工作是這樣的:

  • onPageScrollStateChanged被稱爲與國家ViewPager.SCROLL_STATE_DRAGGING
  • onPageScrolled將被調用多次,它的參數positionOffset和positionOffsetPixels正在不斷增加
  • onPageScrolled的參數positionOffset大於0.5,onPageScrollStateChanged被調用狀態SCROLL_STATE_SETT凌
  • 使用onPageSelected被調用,下一個頁面索引位置
  • onPageScrolled將被調用多次,它的參數positionOffset和positionOffsetPixels正在不斷增加
  • onPageScrolled的參數positionOffset爲1,onPageScrollStateChanged被稱爲與國家SCROLL_STATE_IDLE

邏輯不應該放在onPageSelected和onPageScrollStateChanged上,因爲在他們你只知道狀態改變了。只有在onPageScrolled你可以得到方向。所以我的實現是這樣的:

 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

如何獲得Page_count – Praneeth 2016-02-19 06:28:11

+0

'PAGE_COUNT'可能是在課程頂部定義的一個常量。您可以改用項目的數量。 – sotrh 2016-12-19 18:08:05

+0

@praneethkumar從視圖尋呼機的適配器,如adapter.getCount(); – karvoynistas 2017-03-16 09:41:27

0

建議的答案比我想象的要複雜。所以我創建了一個簡單的答案。

我在ViewPager類中使用了OnPageChangeListener。這裏我們有3種方法。 void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) void onPageSelected(int position); void onPageScrollStateChanged(int state);

瞭解onPageScrollStateChanged()中的狀態以及它們的執行順序很重要。有3個狀態,分別爲SCROLL_STATE_IDLE,SCROLL_STATE_DRAGGING和SCROLL_STATE_SETTLING。

這是執行順序。 Scroll_state_dragging - > Scroll_state_settling - > onPageSelected() - > Scroll_state_idle

這個想法是在onPageSelected()中保留一個標誌來記錄當前頁碼。然後,如果用戶在最後一頁並向左滑動scroll_state_dragging並啓動下一個視圖。

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

我已經創建了一個完整的例子here.