2013-04-11 54 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.