寻呼适配器启动位置

我使用下面的例子来实现我的 viewPager: Http://code.google.com/p/viewpagerexample/issues/list

这个例子的问题在于我不知道如何设置我的起始位置,默认的起始位置是0。基本上,我不想能够控制,如果有一个可用的视图在它的左边或右边。

有没有办法控制中心的视图当前位置? 有没有更好的方法来做到这一点? 有可能把它做成圆形吗?

88291 次浏览

我已经找到了一种方法来设置它的位置,这是在课外完成的:

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

它可以通过计算我想要适合它的项目的数量来加以限制

我遇到了一个问题,如果我在设置适配器之前设置当前项目,我得到的第一个项目将始终是位置0的项目。

务必这样做:

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

而不是:

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);

我已经注意到,如果您使用 ViewPager 的 FragmentStatePagerAdapter 重新创建 Activity (方向更改) ,那么 Adapter 将重用它的片段。阻止它的方法是:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
if (viewPager != null) {
// before screen rotation it's better to detach pagerAdapter from the ViewPager, so
// pagerAdapter can remove all old fragments, so they're not reused after rotation.
viewPager.setAdapter(null);
}
super.onSaveInstanceState(savedInstanceState);
}

但是在活动重建之后,ViewPager 总是首先打开第0页,而 setCurrentItem (CurrentPosition) ; 不工作。修正了延迟后页面改变的问题:

new Handler().postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(newPosition);
}
}, 100);
@Override
public Object instantiateItem(ViewGroup container, int position) {
View currentPage = null;
switch(position){
case 0:
currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)
break;
case 1:
currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)
///////////// This page will be default ////////////////////
((ViewPager)container).setCurrentItem(position);
////////////////////////////////////////////////////////////
break;
case 2:
currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)
break;
return currentPage;
}

我正在使用3个片段,在启动我的应用程序时,第二个(中间)片段将默认显示。只是我正在使用 onResume 函数,所有工作都很好。

@Override
protected void onResume() {
super.onResume();
m_viewPager.setCurrentItem(1);
}

从我做的最后一个片段开始:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);

我有一个数组的大小超过1000和在动态浏览器我面临的左键卡在第一次载入。下面的代码解决了这个问题,并导致了平滑的滚动:

@Override
onResume(){
super.onResume();
viewPager.setCurrentItem(newPosition);
}

我也遇到了同样的问题。 初始化 ViewPager 时,指示器位置为0。 这可能取决于对 Pager 内容的计算量。

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.setCurrentItem(newPosition);
removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
}
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

还有,

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
if (observer == null) return;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
observer.removeGlobalOnLayoutListener(listener);
} else {
observer.removeOnGlobalLayoutListener(listener);
}
}

这样,也就永远不用为时间的设定而烦恼了。

使用 viewPager.setCurrentItem(newPosition);向用户显示从起始页到 newPosition的转换,为了防止这种情况发生,并直接显示 newPosition,就像它是起始点一样,我在第二个参数中添加了 false,如下所示:

int newPosition = pages.size()-1; // Get last page position


viewPager.setCurrentItem(newPosition, false); // 2nd parameter (false) stands for "smoothScroll"